gpt4 book ai didi

javascript - 如何使用 JS/node 正确使用 async/await

转载 作者:太空宇宙 更新时间:2023-11-04 03:22:27 24 4
gpt4 key购买 nike

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

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()。

最佳答案

您必须await等待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();
})

关于javascript - 如何使用 JS/node 正确使用 async/await,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48658985/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com