#javascript #node.js #asynchronous #async-await #node-postgres
Вопрос:
Я запрашиваю базу данных следующим образом:
const testMe = async () => {
const index = await _fetchNextIndex()
if (index === undefined) {
throw new Error('Next index could not fetched')
}
return 'Success'
}
const _fetchNextIndex = async () => {
return db.query("SELECT nextval(pg_get_serial_sequence('testme_table', 'id'))", (err, result) => {
if (err) {
throw new Error('Index could not generated')
}
return result.rows[0]
})
}
db
определяется как:
const {Pool} = require('pg')
const pool = new Pool()
module.exports = {
query: async (text, params, callback) => {
return await pool.query(text, params, callback)
}
}
Мой код не работает синхронно. index
не определено, и возникает ошибка. Однако, когда я отлаживаю приложение, я вижу, что эта строка вызывается спустя некоторое время:
return result.rows[0]
Чего мне не хватает?
ПРАВКА 1: Я добавил async
и await
в query
функцию.
ПРАВКА 2: Я также удалил обратный вызов.
const {Pool} = require('pg')
const pool = new Pool()
module.exports = {
query: async (text, params) => {
return await pool.query(text, params)
}
}
Комментарии:
1. Ваш код не может работать синхронно, доступ к БД всегда асинхронен. Даже если вы ожидали, что он будет выполняться последовательно , ваша функция ничего не возвращает, а просто передает обратный
query
вызов . Не используйте обратные вызовы, используйте обещания, которые вы можетеawait
—pg
даже поддерживайте их изначально!2. Я не знаком с библиотеками, которые вы используете, но тот факт, что
query
требуется обратный вызов, заставил бы меня поверить, что он не возвращает обещание, которое решается с результатом.3. Каждое
async
действие возвращает aPromise
. Это асинхронный объект. Чтобы дождаться его завершения синхронно, вы можете использоватьawait pool.query(...);
.await
может использоваться только внутриasync
функции. В любом случае,db.query
получает обратный вызов в качестве второго параметра, поэтому я думаю, что он все равно не будет синхронным. Проверьте, что предлагает @Bergi4. Я добавил асинхронность и ожидание в функцию запроса, но тоже не сработало. Как я могу использовать обещания или как я могу использовать
pg
родной язык ?await
PS: Я новичок в NodeJS.5. » Я добавил асинхронность и ожидание в функцию запроса. «- теперь тоже снимай
callback
, и тебе хорошо идти. Смотрите примеры в документации pg.