#node.js #google-cloud-firestore #async-await
#node.js #google-cloud-firestore #асинхронный-ожидание
Вопрос:
Я уверен, что эта проблема связана с моим отсутствием знаний об асинхронности / ожидании или общих рекомендаций в целом. Однако я не могу понять, что я делаю не так. Я хочу извлечь значение из своей базы данных firestore, включить его в массив «глобальных переменных», а затем вызвать его, когда оно мне понадобится в других модулях. Однако, когда я проверяю массив, извлеченный в тестовой функции, он всегда возвращает обещание. Приведенный ниже код является примером последнего, что я пробовал.
index.js
const vars = require('./variables');
test();
async function test() {
console.log('Expect database value', await vars.global()['lovePizza']);
}
variables.js (это работает, массив обновляется)
const db = require('./database');
Let globalVars = {
lovePiza : '',
}
const variables = {
async global() {
globalVars['lovePizza'] = (globalVars['lovePizza'] === '') ? db.getLovePizza() : globalVars['lovePizza'];
return globalVars;
}
}
module.exports = variables;
database.js (это работает, значение извлекается из базы данных)
const database = {
async getLovePizza() {
const usersRef = db.collection('accounts').doc('user1');
const doc = await usersRef.get();
if (!doc.exists) {
console.log('No such document!');
} else {
return doc.data()['lovePizza'];
}
}
}
module.exports = database;
Терминальный ответ:
Expect database value undefined
Ответ №1:
Я увидел проблему в вашем variables.js , Я надеюсь, что проблема будет решена с помощью этих изменений, используйте await перед db.getLovePizza()
используйте try/catch
, когда вы используете async/await
const db = require('./database');
Let globalVars = {
lovePiza : '',
}
async global() {
if(globalVars['lovePizza'] === ''){
try {
let result = await db.getLovePizza()//use await
console.log(result);
globalVars['lovePizza'] = result
} catch (error) {
console.log(error)
//do somthing for error handlig like throw
}
}
else{
globalVars['lovePizza'] = globalVars['lovePizza'] //I think there is no need for this
}
return globalVars;
}
index.js
test() {
let result = await vars.global()
console.log('Expect database value', result);// added to question
console.log('Expect database value', result['lovePizza']);// added to question
}
Комментарии:
1. Спасибо, что поймали это, это помогло, но результаты по-прежнему остаются неопределенными. Ваш ответ помогает, потому что теперь в index.js если я определю vars.global() как свою собственную переменную, а затем вызову ее снова в console.log, это сработает. Однако, желательно, чтобы я мог ссылаться на него напрямую, используя vars.global()[‘lovePizza’] . Разве это невозможно?
2. ваше приветствие, к сожалению, у меня нет опыта работы в Google-cloud-firestore, можете ли вы добавить результат
console.log()
, подобный части добавленного к моему ответу, может быть, я смогу вам помочь, потому что тип результата должен проверять3. из-за переменных функция global() является асинхронной, поэтому в первую очередь вы должны присвоить переменной
4. хорошо, хорошо отмечено, поэтому я должен присвоить переменной. большое спасибо