我正在使用一个NodeJS应用程序,当用户向/films发送GET时,该应用程序从Sqlit-3文件中获取电影名称和描述。在将对象推到数组中时,似乎遗漏了一件东西。我不明白我错过了什么。对象不会被推送到数组中,并且在我将其作为响应res.json()时总是显示为空[]。
app.get('/films', (req, res) => {
let db = new sqlite3.Database('./data.db', sqlite3.OPEN_READWRITE, err => {
if (err) return console.error(err.message)
console.log('DB connected')
})
var films = []
db.serialize(() => {
db.each('select * from film', (err, row) => {
if (err) return console.log(err.message)
// console.log(row.name + '\t' + row.description)
films.push({
"name": row.name,
"description": row.description
})
})
})
res.json(films)
db.close(err => {
if (err) return console.error(err.message)
console.log('DB coonnection closed')
})
})发布于 2020-10-20 18:24:41
您的问题是Express在数据库检索任何值之前返回响应对象。要解决这个问题,通常需要在回调函数中移动它。
但是,在您的情况下,db.each()方法实际上接受两个函数。第一个是callback,它在检索每个值之后运行,一点帮助都没有。在文档中,第二个名为complete,它完全满足您的需要。
这是来自文档中的完全引用 wiki的db.each()的node-sqlite3。
这样,您就可以这样编写代码:
db.each(
'select * from film',
(err, row) => { /* Does normal stuff */ }),
(err, num) => { /* Sends response to client */
res.json(films);
console.log(`Retrieved ${num} films`); // (Just to show what the 2nd argument does)
}
);请记住,如果您的电影数据库不是特别庞大的文档,实际上建议使用db.all方法。
https://stackoverflow.com/questions/64442550
复制相似问题