获取Firebase数据后,异步函数未返回值

时间:2018-08-12 02:28:56

标签: javascript firebase firebase-realtime-database

我设置了一个项目,以将值返回到app.js,而无需处理promise。当我运行它时,此代码返回未定义。有提示吗?

export.js `

const admin = require('firebase-admin')
const db = admin.firestore();
const ref = db.collection('Things')

async function getNameV(ting) {
  return await ref.get().then(doc => {
   doc.forEach(documentSnapshot => {
    var data = documentSnapshot.data()
    if (ting == data.name || ting == data.id) {
     return data.name
    }
   })
 })
};

module.exports.getName = function(ting) {
  getNameV(ting).then(value =>{
    console.log(value)
    return value;
  })
};

app.js

 const exp = require('./export.js')
 var name = await exp.getName('foo')
 console.log(name)

2 个答案:

答案 0 :(得分:2)

您必须返回在您的module.exports.getName函数中创建的承诺,如下所示:

module.exports.getName = function(ting) {
    return getNameV(ting).then(value =>{
        console.log(value)
        return value;
    });
};

然后,在app.js端,必须确保从async函数调用导出的函数(否则,将无法使用await调用它) :

const exp = require('./export.js')
async function start() {
    var name = await exp.getName('foo')
    console.log(name);
}
start();

答案 1 :(得分:0)

雨果是正确的,但除此之外,您还有另一个错误。 getNameV甚至没有返回能够产生您所期望的价值的承诺。 return data.name实际上只是从传递给forEach()的匿名函数返回。该值不会使您成为从getNameV返回的承诺。现在,从字面上看,它只是返回一个包含现在未定义的Promise。

此外,return await [promise]在这里是多余的。您只能return [promise],甚至不能都用getNameV标记async