Node.js 将API数据与MongoDB数据相结合
我目前正在开发一个从外部API获取数据的NodeJS API。该API还有一个MongoDB,其中包含外部API不提供的额外数据 我想做的是: 从外部API获取项目,添加保存在MongoDB中的额外数据,并作为一个整体返回 我正在尝试这个:Node.js 将API数据与MongoDB数据相结合,node.js,mongodb,Node.js,Mongodb,我目前正在开发一个从外部API获取数据的NodeJS API。该API还有一个MongoDB,其中包含外部API不提供的额外数据 我想做的是: 从外部API获取项目,添加保存在MongoDB中的额外数据,并作为一个整体返回 我正在尝试这个: HTTP.get({ host: 'example.com', path: '/exam/ple', method: 'GET' }, function(response){ var body = ''; respon
HTTP.get({
host: 'example.com',
path: '/exam/ple',
method: 'GET'
}, function(response){
var body = '';
response.on('data' , function(chunk){
body += chunk;
});
response.on('end', function(){
json = JSON.parse(body);
//Attach own data with fetched data
json.trucks.forEach(function(item){
DB.collection(COLLECTION).findOne({"id" : example.id}, function(err, doc){
if(!err){
item.extra = doc.extra;
item.extra2= doc.extra2;
console.log(truck); //Check if truck is updated
}
});
});
res.body(200).json(json);
});
});
但这不起作用。主体/响应是仅从API获取的数据。但是数据正在foreach循环中合并
**更新
我添加了“回调”的用法,代码如下:
var getLocalStorage = function(_id , callback){
DB.collection(COLLECTION).findOne({id : _id}), function(err,msg){
if(!err){
callback(null,doc)
}
}
}
HTTP.get({
host: 'demo1757530.mockable.io',
path: '/vrachtwagens/in',
method: 'GET'
}, function(response){
var body = '';
response.on('data' , function(chunk){
body += chunk;
});
response.on('end', function(){
var i = 0,
data = JSON.parse(body);
data.items.forEach(function(item){
i++
getLocalStorage(item._id, function(err,msg){
//MERGE DATA
}
});
if(i === data.items.length){
//return body
}
但是结果还是一样的您不了解node.js中的回调模式。在触发对mongo数据库的第一个请求之前发送响应。试着了解更多关于它的信息,在你这么做之前,这是一个有效的(尽管不是很优雅)解决方案
你说得对,以前从未和nodejs合作过。。我知道它不优雅,但找不到任何其他方法来达到这个效果。非常感谢你的帮助!
json = JSON.parse(body);
//Attach own data with fetched data
var i=0;
json.trucks.forEach(function(item){
DB.collection(COLLECTION).findOne({"id" : example.id}, function(err, doc){
i++;
if(!err){
item.extra = doc.extra;
item.extra2= doc.extra2;
console.log(truck); //Check if truck is updated
}
if (i === json.trucks.length){
res.body(200).json(json);
}
});
});