来自 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
方法。
我正在使用 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
方法。