google-actions-如何在nodejs中的Promise中使用mongo-on-google库在对话框流实现中进行mongodb查询?

时间:2018-12-27 00:21:53

标签: node.js mongodb dialogflow actions-on-google

在我的对话框流实现中,我想查询一个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)
});

1 个答案:

答案 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