Javascript 如何使用JS/node正确使用async/await

Javascript 如何使用JS/node正确使用async/await,javascript,node.js,mongodb,async-await,Javascript,Node.js,Mongodb,Async Await,我正在尝试创建一个脚本,该脚本将使用从几个API调用返回的数据填充我的Mongo数据库。理想情况下,每隔一段时间或在计划程序上手动运行一次,以使用新数据更新数据库,因此我尝试在“MongoClient.conncect”函数中执行所有操作。我想一次导入一个API调用这个数据,并试图避免链式承诺和.then的丑陋。我对使用async/await做了一些研究,在我看来,使用'await'关键字有效地解除了返回的承诺。如果是这样的话,我不太明白为什么它不能正常等待。以下是我到目前为止的情况: cons

我正在尝试创建一个脚本,该脚本将使用从几个API调用返回的数据填充我的Mongo数据库。理想情况下,每隔一段时间或在计划程序上手动运行一次,以使用新数据更新数据库,因此我尝试在“MongoClient.conncect”函数中执行所有操作。我想一次导入一个API调用这个数据,并试图避免链式承诺和.then的丑陋。我对使用async/await做了一些研究,在我看来,使用'await'关键字有效地解除了返回的承诺。如果是这样的话,我不太明白为什么它不能正常等待。以下是我到目前为止的情况:

const MongoClient = require('mongodb').MongoClient;
const fs = require('fs');
const assert = require('assert');
const ProPublicaAPI = require('./ProPublicaAPI');
var constants = require('../common/constants');
var https = require('https');

const url = 'mongodb://localhost:27017';


dbName = 'government';

MongoClient.connect(url, function(err, client) {
  assert.equal(null, err);
  console.log('successfully connected to mongoDB server: ' + url);

  const db = client.db(dbName);
  try{
    var senateInsert = waitInsert(db, 'senate');
  }
  catch(err) {
    console.log(err);
  }
  console.log('closing database connection');
  client.close();
})

async function waitInsert(db, collection) {
  //I made this function just to call inside the MongoClient.connect() above
  return await insertSenateDocuments(db, collection);
}

function insertSenateDocuments(db, chamber) {
  return new Promise(function(resolve) {
    var collection = db.collection(chamber);
    //method that calls API, to be converted into async/await later
    senateMembers = ProPublicaAPI.getAllMembersByChamber(chamber);
    senateMembers.then(function(promisedMembers) {
      console.log("Recieved data from api");
      collection.insertMany(promisedMembers, function(err, result) {
        if(err) return console.log(err);
        console.log(`Imported ${chamber} data`);
        resolve(result);
      });
    })
  })
}
这是堆栈跟踪:

successfully connected to mongoDB server: mongodb://localhost:27017
about to close
Recieved collection Data
{ MongoError: server instance pool was destroyed
    at basicWriteValidations (D:\Dev\node\node_modules\mongodb-core\lib\topologies\server.js:636:41)
    at Server.insert (D:\Dev\node\node_modules\mongodb-core\lib\topologies\server.js:737:16)
    at Server.insert (D:\Dev\node\node_modules\mongodb\lib\topologies\topology_base.js:315:25)
    at executeCommands (D:\Dev\node\node_modules\mongodb\lib\bulk\ordered.js:525:23)
    at executeOperation (D:\Dev\node\node_modules\mongodb\lib\utils.js:408:22)
    at OrderedBulkOperation.execute (D:\Dev\node\node_modules\mongodb\lib\bulk\ordered.js:602:10)

    at bulkWrite (D:\Dev\node\node_modules\mongodb\lib\collection.js:627:8)
    at executeOperation (D:\Dev\node\node_modules\mongodb\lib\utils.js:408:22)
    at Collection.insertMany (D:\Dev\node\node_modules\mongodb\lib\collection.js:512:10)
    at D:\Dev\node\dataimporter\mongo.js:39:18
  name: 'MongoError',
  message: 'server instance pool was destroyed' }
PS D:\Dev\node\dataimporter> node mongo
successfully connected to mongoDB server: mongodb://localhost:27017
closing database connection
Recieved data from api
{ MongoError: server instance pool was destroyed
    at basicWriteValidations (D:\Dev\node\node_modules\mongodb-core\lib\topologies\server.js:636:41)
    at Server.insert (D:\Dev\node\node_modules\mongodb-core\lib\topologies\server.js:737:16)
    at Server.insert (D:\Dev\node\node_modules\mongodb\lib\topologies\topology_base.js:315:25)
    at executeCommands (D:\Dev\node\node_modules\mongodb\lib\bulk\ordered.js:525:23)
    at executeOperation (D:\Dev\node\node_modules\mongodb\lib\utils.js:408:22)
    at OrderedBulkOperation.execute (D:\Dev\node\node_modules\mongodb\lib\bulk\ordered.js:602:10)
    at bulkWrite (D:\Dev\node\node_modules\mongodb\lib\collection.js:627:8)
    at executeOperation (D:\Dev\node\node_modules\mongodb\lib\utils.js:408:22)
    at Collection.insertMany (D:\Dev\node\node_modules\mongodb\lib\collection.js:512:10)
    at D:\Dev\node\dataimporter\mongo.js:39:18
  name: 'MongoError',
  message: 'server instance pool was destroyed' }

如您所见,在插入文档之前调用了client.close()。您必须等待
等待
等待
等待插入

MongoClient.connect(url, async function(err, client) {
  assert.equal(null, err);
  console.log('successfully connected to mongoDB server: ' + url);

  const db = client.db(dbName);
  try{
    var senateInsert = await waitInsert(db, 'senate');
  }
  catch(err) {
    console.log(err);
  }
  console.log('closing database connection');
  client.close();
})

您必须等待
waitInsert

MongoClient.connect(url, async function(err, client) {
  assert.equal(null, err);
  console.log('successfully connected to mongoDB server: ' + url);

  const db = client.db(dbName);
  try{
    var senateInsert = await waitInsert(db, 'senate');
  }
  catch(err) {
    console.log(err);
  }
  console.log('closing database connection');
  client.close();
})
更容易:

bulkWriteItems(array, collection) {
    return collection.bulkWrite(array, {ordered: true, w: 1})
}
电话:

async saveData(){
让批量=[];
for(设i=0;i<100;i++){
let name=`item${i}`
bulk.push({insertOne:{name}});
}
返回db.collection(collection\u对象)。然后(collection=>this.bulkWriteItems(bulk,collection))
}
更简单:

bulkWriteItems(array, collection) {
    return collection.bulkWrite(array, {ordered: true, w: 1})
}
电话:

async saveData(){
让批量=[];
for(设i=0;i<100;i++){
let name=`item${i}`
bulk.push({insertOne:{name}});
}
返回db.collection(collection\u对象)。然后(collection=>this.bulkWriteItems(bulk,collection))
}

var senateInsert=waitInsert(db,“senate”);此行不等待您的异步调用。你必须申报。您可以考虑在函数中进行连接,请尝试<代码> var SnAtEdvsAs=等待WaItSe插入(DB,'参议院');<代码>相反
var senateInsert=waitInsert(db,'senate')并让我知道结果谢谢,我会试试这个。然而,我很好奇,如果Wait正在“拆封”承诺,而我正在waitInsert中返回它,那么为什么我在调用waitInsert时必须再次调用Wait?有没有一种方法可以做到这一点,而不必使用waitInsert,直接调用insertSenateDocuments?var senateInsert=waitInsert(db,“senate”);此行不等待您的异步调用。你必须申报。您可以考虑在函数中进行连接,请尝试<代码> var SnAtEdvsAs=等待WaItSe插入(DB,'参议院');<代码>相反
var senateInsert=waitInsert(db,'senate')并让我知道结果谢谢,我会试试这个。然而,我很好奇,如果Wait正在“拆封”承诺,而我正在waitInsert中返回它,那么为什么我在调用waitInsert时必须再次调用Wait?有没有一种方法可以做到这一点,而不必使用waitInsert,直接调用insertSenateDocuments?