Hello World...

nodejs lowdb 테스트 중 return 본문

node.js

nodejs lowdb 테스트 중 return

FaustK 2020. 1. 17. 22:04

nodejs -express 에 lowdb를 연동해보려고 이것저것 해보고 있는데, res.end or res.json 앞에 return 을 작성 안 하면 에러가 발생한다는 점을 발견했다.

res.end() 또는 res.josn() 서버 응답 메서드를 실행해도 함수가 종료되지 않는다. 어떻게 보면 너무 당연한 것이지만, 서버 쪽 코드를 짜면서 은근 헷갈리는 부분인 것 같다.

return 을 통해 확실히 끝맺음(?) 해주어야 한다.

 

const express = require('express');
const app = express();
const port = 3003;

// lowdb setting
const low = require('lowdb');
const FileSync = require('lowdb/adapters/FileSync');
const adapter = new FileSync('db.json');
const db = low(adapter);

let obj = { results: [] };
let cntID = 1;
db.defaults(obj).write();

// middleware
app.use(express.json());

// routes
app.get('/', (req, res) => res.send('Hello World!'));

app.get('/db', (req, res) => {
  if (req.query.roomname) {
    const roomname = req.query.roomname;
    const results = db
      .get('results')
      .filter({ roomname })
      .value();

    res.json(results);  // 여기서 return res.json()을 해주지 않으면 실행은 되도 에러 메시지를 받게 된다.
    // Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
  }

  const results = db.get('results').value();
  res.json(results);
});

// 만약 바로 파라미터로 받으려면 아래와 같이
// app.get('/db/:roomname', (req, res) => {
//   const roomname = req.params.roomname;
//   const results = db
//     .get('results')
//     .filter({ roomname })
//     .value();

//   res.json(results);
// });

app.post('/db', (req, res) => {
  const obj = {
    id: cntID,
    username: req.body.username,
    text: req.body.text,
    roomname: req.body.roomname,
    date: new Date().toISOString()
  };
  db.get('results')
    .push(obj)
    .write();
  ++cntID;
  console.log('post obj: ', obj);
  console.log('cnt: ', cntID);
  res.send('ok post');
});

// listening
app.listen(port, () => console.log(`Example app listening on port ${port}!`));
Comments