在我的对话框流实现中,我想查询一个mongodb数据库,并根据结果返回答案。由于我使用的是Google Actions数据库,因此必须对异步调用使用Promise。 对于mongodb查询,该怎么办?
const express = require("express");
const bodyParser = require("body-parser");
const {dialogflow} = require('actions-on-google');
const app = dialogflow()
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/"
app.intent('Mongodb', (conv) =>{
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("mydb");
var query = { address: /^S/ };
var path;
db.collection('paths', function(err, collection) {
collection.find({}).toArray(function(err, results) {
path = results;
console.log(results);
});
});
});
conv.ask(path)
});
答案 0 :(得分:2)
如果您不传递回调函数,Node mongodb程序包将从其大多数基于回调的API中返回一个Promise(可能是所有?)。例如,您可以呼叫db.collection('paths').then(function (collection) { … })
。然后,您可以像下面这样链接诺言:
return MongoClient.connect(url)
.then(function (client) {
return client.db('mydb');
}).then(function (db) {
return db.collection('paths');
}).then(function (collection) {
return collection.find({}).toArray();
}).then(function (path) {
conv.ask(path);
});
您还可以使用new Promise((resolve, reject) => …)
构造函数包装Promise API中基于回调的所有内容。关于MDN的Promise文档有一个很好的示例here。