node.js - 将 API 数据与 MongoDB 数据结合起来

标签 node.js mongodb

我目前正在开发一个 NodeJS API,该 API 从外部 API 获取数据。该 API 还具有一个 MongoDB,其中包含外部 API 不提供的额外数据。

我正在尝试做的事情: 从外部API获取项目,添加保存在MongoDB中的额外数据并整体返回。

我正在尝试这个:

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 数据库发出第一个请求之前发送响应。尝试了解更多相关信息,在此之前,这是可行的(但不是很优雅)解决方案

    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);
            }
        });
    });       

关于node.js - 将 API 数据与 MongoDB 数据结合起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37617659/

相关文章:

node.js - 如何将文件写入Windows系统文件夹?

javascript - 子类化 Meteor.users() 以获得不同的用户类型

php - 在 MongoDB GridFS 中存储图像

java - 将中文保存到mongodb 2.4.8 导致不可读的字符串

javascript - 无法访问此函数内的参数

node.js - CLI 无服务器部署期间 Google Chrome 选项卡崩溃

mongodb - meteor $and 与 $or

mongodb - 带有 MongoDB 的重复事件模式

node.js - 使用 AWS Amplify 对 Google 登录进行身份验证 - federatedSignin 返回 null?

node.js - 启动Electron应用程序时出现问题-[603 :0827/215406. 435140 :FATAL:electron_main_delegate. cc(264)]不支持以root用户身份运行而没有--no-sandbox