【发布时间】:2017-12-15 20:14:14
【问题描述】:
我遇到了回调、异步思维等问题。
执行程序:
- 连接到 mongoDb。
- 创建 url - https://example.com + 从 locArray 添加部分。
- 发送获取请求(针对每个)。
- 将数据保存到 mongo db。
- 关闭连接。
问题:
如果连接在 jsonDataFromApi 的最后一行关闭 - 在每个请求的所有数据都保存到 db 之前“服务器实例池已被破坏”
所以
callback(db)被发送到另一个地方-closeMongoDb- 但出现错误
“无法读取未定义的属性‘关闭’”。
我认为,问题在于异步、发送回调等。
const MongoClient = require('mongodb').MongoClient;
const Array = require('node-array');
const request = require('request');
var locationArray = [
'location1',
'location2',
'location3',
'location4'
];
var dataFromLocApi = (loc, callback) => {
request({
url: `https://example.com/${loc}`,
json: true
}, (error, response, body) => {
if (error){
callback('Error connection to url.');
} else{
callback(undefined, body.result);
}
});
};
var jsonDataFromApi = (urldb, callback) => {
MongoClient.connect(urldb, (err, db) => {
if (err) {
console.log('MongoDb connection error.');
}
console.log('MongoDb - connected.');
locationArray.forEachAsync(function(loc, index, arr) {
dataFromLocApi(loc, (errorMessage, results) => {
if (errorMessage) {
console.log(errorMessage);
} else {
console.log(JSON.stringify(results, undefined, 2));
db.collection('testCollection').insert(results, function(error, record) {
if (error)
throw error;
console.log("data saved");
});
}
});
}, function() {
console.log('complete');
});
callback(db);
});
}
var closeMongoDb = (urldb, callback) => {
jsonDataFromApi(urldb, (error, db) => {
if (error){
callback('Close connection - failure');
} else{
db.close();
console.log('MongoDb connections was closed.');
}
});
}
closeMongoDb('mongodb://127.0.0.1:27017/testDb', (err, db) => {
console.log('DONE');
} );
【问题讨论】:
-
能否也粘贴
closeMongoDb的函数代码? -
都是代码,closeMongoDb不是函数。
-
那是什么?
-
我想启动脚本。所以我应该创建 closeMongoDb 函数并像在我的示例代码上一样运行它?
-
在
jsonDataFromApi的末尾,您将db作为第一个参数提供给回调。但在closeMongoDb调用中,回调将db作为第二个参数。
标签: javascript node.js mongodb asynchronous callback