我编写了这段代码,以使用dialogflow打造一个市场机器人。我还创建了一个简单的数据库,以将有关用户的实际购物车的信息保存在firestore上。但是,当我在Inline Editor上运行此功能时,我的机器人仅回答“ Seu carrinho:”,而与恢复的信息无关。该信息在Firestore控制台中正确显示,表明信息检索正确。我认为这是我不了解的异步功能问题。帮助吗?
function myfunction(agent){
var opt = agent.parameters.number;
if(opt == 1){
agent.add(`Ver estoque`);
}else if(opt == 2){
agent.add(`Seu carrinho: `);
const carrinho = db.collection('/Usuarios/Usuario1/Carrinho');
var produtosCarrinho = carrinho.get()
.then(snapshot => {
snapshot.forEach(doc => {
console.log(doc.id, '=>', doc.data());
agent.add(`${doc.id} - ${doc.data().Quantidade} ${doc.data().Bloco} - ${doc.data.Preco}\n`);
});
})
.catch(err => {
console.log(err);
});
}else{
agent.add(`errou`);
}
}
答案 0 :(得分:0)
您确定收集路径正确吗?似乎您正在尝试获取子集合,但是如果没有数据结构,我无法确定。如果我是对的,则类似:
function myfunction(agent){
var opt = agent.parameters.number;
if(opt == 1){
agent.add(`Ver estoque`);
}else if(opt == 2){
agent.add(`Seu carrinho: `);
const carrinho = db.collection('Usuarios').doc('Usuario1').collection('Carrinho');
var produtosCarrinho = carrinho.get()
.then(snapshot => {
snapshot.forEach(doc => {
console.log(doc.id, '=>', doc.data());
agent.add(`${doc.id} - ${doc.data().Quantidade} ${doc.data().Bloco} - ${doc.data.Preco}\n`);
});
})
.catch(err => {
console.log(err);
});
}else{
agent.add(`errou`);
}
}
应该工作。 我认为只是删除第一个斜杠是这样的:
const carrinho = db.collection('Usuarios/Usuario1/Carrinho');
也可以工作
答案 1 :(得分:0)
问题是您调用carrinho.get().then(...).catch(...)
返回了一个Promise,该Promise存储在produtosCarrinho
中,但是您对该Promise却不做任何事情。
最重要的是,由于这是Intent Handler的一部分,因此您需要将此Promise返回给Handler Dispatcher。这样一来,它就知道在将答复发送回用户之前,等待Promise兑现(即,它调用then()
部分中的函数)。
所以发生的事情是您开始数据库调用,但是您的函数几乎立即完成并在调用完成之前返回,告诉处理程序将答复发送给用户。
对于您而言,它应该很容易修复。除了将Promise存储在您从未使用过的变量中之外,您还可以使用以下内容将其返回:
return carrinho.get()
.then(doc => {...})
.catch(err => {...});