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}!`));