Как использовать Promise в узле js для запроса mongodb при выполнении диалогового потока с библиотекой actions-on-google? - PullRequest
0 голосов
/ 27 декабря 2018

В моем выполнении диалогового потока я хочу запросить базу данных mongodb и на основе результата вернуть ответ.Поскольку я использую базу данных Actions-on-Google, я должен использовать обещания для асинхронных вызовов.Как я могу сделать это для запроса 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 голосов
/ 27 декабря 2018

Пакет Node mongodb будет возвращать Promise от большинства (возможно, всех?) Его API на основе обратного вызова, если вы не передадите функцию обратного вызова.Например, вы можете позвонить 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.В документации Promise по MDN есть хороший пример здесь .

...