簡體   English   中英

使用NodeJS許諾查詢MongoDB

[英]Using NodeJS promise to query MongoDB

我正在使用WATSON API構建聊天機器人,該機器人發送藝術家數據以提供用戶輸入。 由於數據庫訪問是異步的,因此我嘗試使用nodejs promise來查詢數據庫並打印出數據。

因此artpromise函數是一個函數,它接受藝術家的姓名並查詢數據庫,以將結果保存在'result'變量中。 然后,我嘗試打印出結果(在chatbot中,我實際上將結果打印出給用戶)。

但是我沒有得到想要的結果,並不斷收到語法錯誤。 任何幫助,將不勝感激。

let arttistinfo;

function artpromise (artist) {
  return new Promise(function(resolve, reject) {
    const MongoClient = require("mongodb").MongoClient;
    const url = 'mongodb://majac.co.kr:27017/artbot';
    MongoClient.connect(url, function(err, db) {
      if (err) throw err;
      var dbo = db.db("artbot");
      var query = {name: artist};
      artistinfo = dbo.collection("artistdb").find(query)
        .toArray(function(err, result) {
          if (err) throw reject(err);
          resolve(result);
      });
      db.close();
    }
  });
)};


let artist = "Jan Tarasin";
artpormise.then(function(artist) {
  console.log(result);
});

我將這樣重寫,可以看到您的代碼存在少量問題,但是現在對我有用:

function artpromise (artist) {
  return new Promise(function(resolve, reject) {
    const MongoClient = require("mongodb").MongoClient;
    const url = 'mongodb://majac.co.kr:27017/artbot';
    MongoClient.connect(url, function(err, db) {
      if (err) throw err;
      var dbo = db.db("artbot");
      var query = {name: artist};
      artistinfo = dbo.collection("artistdb").find(query)
        .toArray(function(err, result) {
          if (err) throw reject(err);
          resolve(result);
      });
      db.close();
    });
  });
};

let artist = "Jan Tarasin";
artpromise(artist).then(function(result) {
  console.log(result);
});

我得到以下結果:

[{
    _id: 5abdbc18423795deaaff0d8e,
    nationality: 'Polish',
    art_link: 'https: //media.mutualart.com/Images/2016_06/29/20/203606422/0532d043-71f6-47bc-945e-aeededd2d483_570.Jpeg',
    years: '1926',
    name: 'JanTarasin',
    art_title: '"Falujace watki I",
    2003r.'
}]

MongoDB節點驅動程序本身就支持從v3開始的承諾。 因此,通過使用它們,可以大大簡化代碼。

這是我將如何處理您的問題;

function artpromise (artist) {
  const MongoClient = require("mongodb").MongoClient;

  return MongoClient.connect('mongodb://majac.co.kr:27017')       // connect to mongo server
                    .then(mc => mc.db('artbot')                   // get mongoClient object and connect to artbot db
                                  .collection('artistdb')         // connect to the artistdb collection
                                  .find({name: artist})           // perform your query
                                  .toArray()                      // convert the results into an array
                                  .then(as => (mc.close(), as)))  // close db and return array from query result
                    .catch(e => console.log(e));                  // catch errors
}


let artist = "Jan Tarasin";
artpromise(artist).then(as => as.forEach(a => console.log(a)));

[nodemon] starting `node maeror.js`
{ _id: 5abdbc18423795deaaff0d8e,
  nationality: 'Polish',
  art_link: 'https://media.mutualart.com/Images/2016_06/29/20/203606422/0532d043-71f6-47bc-945e-aeededd2d483_570.Jpeg',
  years: '1926',
  name: 'Jan Tarasin',
  art_title: ' "Falujące wątki I", 2003 r. ' }
[nodemon] clean exit - waiting for changes before restart

提醒您cursor.toArray()返回一個promise可能很有用,因為它必須在構造結果數組之前立即迭代所有查詢結果。 有時,此操作可能很耗時,導致服務器響應延遲。 因此,您可以改為使用cursor.forEach()方法像流一樣逐一處理從查詢返回的文檔。 這意味着處理第一個文檔,然后迭代到下一個文檔。 這是另一個示例,說明如何實現。

function artpromise (artist) {
  const MongoClient = require("mongodb").MongoClient;

  return MongoClient.connect('mongodb://majac.co.kr:27017')         // connect to mongo server
                    .then(function(mc){
                            var cursor = mc.db('artbot')            // get mongoClient object and connect to artbot db
                                           .collection('artistdb')  // connect to the artistdb collection
                                           .find({name: artist});   // get the cursor
                            return [mc, cursor];                    // return mongoClient and cursor objects
                          });
}

let artist = "Italian";
artpromise(artist).then(function([mc,docs]){
                          docs.forEach(doc => console.log(doc),     // process a document and then iterate to the next
                                       ()  => mc.close());          // close db session when all documents are processed
                        })
                  .catch(e => console.log(e));                      // catch errors

[nodemon] starting `node maeror_v2.js`
{ _id: 5abdbc18423795deaafeff13,
  nationality: 'Dutch',
  art_link: 'https://media.mutualart.com/Images/2012_04/15/13/132154856/ddf14e9d-85b1-4b5a-b621-00583e013879_570.Jpeg',
  years: '1839 - 1902',
  name: 'Frederick Hendrik Kaemmerer',
  art_title: ' A Beach Stroll ' }
[nodemon] clean exit - waiting for changes before restart

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM