来自 sqlite-3 数据库的结果不会推送到 Javascript 数组

Result from sqlite-3 DB does not push to Javascript array

我正在使用 NodeJS 应用程序,当用户发送 GET/films。将对象推入数组时,我似乎遗漏了什么。我不明白我错过了什么。当我 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')
    })
})

您的问题是在数据库检索任何值之前,Express returns 响应对象。要解决此问题,您通常会将其移动到回调函数中。

在你的例子中 db.each() 方法实际上接受 2 个函数。第一个是 callback ,它在检索到每个值后运行,根本没有任何帮助。第二个在文档中称为 complete 并且完全满足您的需要。

这是来自 node-sqlite3 wiki 的 db.each()full reference in docs

这样你就可以这样写你的代码了:

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 方法。