首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sqlit-3db的结果不会推到Javascript数组。

Sqlit-3db的结果不会推到Javascript数组。
EN

Stack Overflow用户
提问于 2020-10-20 09:44:03
回答 1查看 291关注 0票数 0

我正在使用一个NodeJS应用程序,当用户向/films发送GET时,该应用程序从Sqlit-3文件中获取电影名称和描述。在将对象推到数组中时,似乎遗漏了一件东西。我不明白我错过了什么。对象不会被推送到数组中,并且在我将其作为响应res.json()时总是显示为空[]。

代码语言:javascript
复制
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')
    })
})
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-20 18:24:41

您的问题是Express在数据库检索任何值之前返回响应对象。要解决这个问题,通常需要在回调函数中移动它。

但是,在您的情况下,db.each()方法实际上接受两个函数。第一个是callback,它在检索每个值之后运行,一点帮助都没有。在文档中,第二个名为complete,它完全满足您的需要。

这是来自文档中的完全引用 wiki的db.each()node-sqlite3

这样,您就可以这样编写代码:

代码语言:javascript
复制
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方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64442550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档