Node.js Значение из Firebase, не обновляющее массив вовремя для вызова функции (даже при асинхронном ожидании)

#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. хорошо, хорошо отмечено, поэтому я должен присвоить переменной. большое спасибо