Я хочу создать массив идентификаторов из запроса sqlite с использованием библиотеки node-sqlite3.
const sqlite3 = require('sqlite3')
const db = new sqlite3.Database('./db/database-name.db')
let ids = () => {
let sql = `select id from users;`
let result = []
db.each(sql, (err, row) => {
// console.info(row.id)
result.push(row.id)
})
return result
}
console.info(ids())
Оператор console.info()
печатает пустой массив. Что я делаю неправильно?
Вы возвращаете массив до завершения функции db.each
. Вот почему он возвращает пустой массив.
Для достижения желаемого результата вам необходимо передать функцию, которая вызывается, когда все строки вытягиваются.
let ids = () => {
let sql = `select id from users;`
let result = []
db.each(sql, (err, row) => {
result.push(row.id)
}, () => {
console.info(result)
})
}
ids()
Спасибо за ответ. Моя цель - вызвать функцию, которая возвращает массив идентификаторов. Как я могу этого добиться?
Мне удалось добиться желаемого результата, заключив вызов db.each
в обещание:
const selectIds = () => {
return new Promise((resolve, reject) => {
let result = []
db.each(`select id from users;`, (err, row) => {
if (err) { reject(err) }
result.push(row.id)
}, () => {
resolve(result)
})
})
}
selectIds().then((ids) => console.info(ids)
Массив печатается до того, как к нему что-либо будет добавлено. Вам нужно дождаться завершения.