Node.js将值从一个api传递到另一个api

loading...


1

我需要从API1获取“data”:3的值,如果字段“data”的值大于或等于3,则检查API2 . 我需要创建一个仅使用API2字段的新API,通过过滤条件,请检查所需的Json:

杰森:

[
{
    "fieldid": "0001",
    "data": 3 , ---- API 1
     "field7": "2018-12-06T11:49:52.389Z" 
},
[
    {

        "field1": "E004",
          "data": 3, --- api 2
        "field7": "2018-12-06T11:49:52.389Z"
    },
    {

        "field1": "E005",
         "data": 2, ---- api 2
        "field7": "2018-12-06T11:49:52.389Z"
    }
],

]

功能:

n getlistofStaffs(req, callback) {
log.info(path.basename(module.filename), "List Staffs :: getlistofStaffs()");
var listofStaffsAPI = api url;

const requestOptions = {
    url: listofStaffsAPI,
    json: true
};

request(requestOptions, function (err, res, body) {
    if (err) {
        return callback(true, null);
    } else if (res.statusCode == 200) {

        var clearancesstaff=body[0].clearanceLevel;
        var staffClearanceId = body[0].staffClearanceId;

        return callback(null, {staffClearanceId:body[0].staffClearanceId,clearancesstaff:body[0].clearanceLevel});
    }
});

}

期望的输出JSON:

[ {
    "fieldid": "0001",
    "data": 3 , 
     "field7": "2018-12-06T11:49:52.389Z" 
}
]

谢谢

loading...

1回答

  • 0

    因为're using the async library, you'll想要使用 .waterfall() 方法,该方法将回调数据从一个回调传递给下一个函数的输入 . 由于我会证明签名,我认为这对你要做的事情是必要的,但是留下细节给你 .

    function getListofStaffs(req, callback) {}
    
    function getListofEvents(req, fieldname, callback) {}
    // later
    module.exports = (req, res, next) => {
      async.waterfall([
        getListofStaffs.bind(null, req),
        getListofEvents.bind(null, req)
      ], (err, results) => {
        if (err) return next(err);
        return res.send(results);
      });
    }
    

    如果您能够这样做,如果您能够使用最后几个版本的节点中提供的async / await功能,则可能会更容易遵循您的代码 . 如果可以,那么你只需要确保你的API调用返回Promises,然后你可以这样做:

    async function getListofStaffs(req) {}
    async function getListofEvents(req, fieldname) {}
    
    module.exports = async (req, res, next) => {
      try {
        const fieldname = await getListofStaffs(req);
        const events = await getListofEvents(req, fieldname);
        res.send({ fieldname, events });
      } catch (err) {
        return next(err);
      }
    }
    

    如果您不想在路线中使用try..catch块,还可以使用asynchandler模块 .

    EDIT

    正如我的评论中所提到的,您需要根据当前设计更新getListofEvents函数以期望三个参数:

    function getlistofEvents(req, clearanceData, callback) {
        var dt = dateTime.create();
        var formatted = dt.format('Y-m-d');
        console.log(formatted);
        console.log(clearanceData);
        log.info(path.basename(module.filename), "List Events :: getlistofEvents()");
        var listofEventsAPI = www.gmail.com;
    
    
        const requestOptions = {
            url: listofEventsAPI,
            json: true
        };
    
    
        request(requestOptions, function (err, res, result) {
            if (err) {
                return callback(true, null);
            } else if (res.statusCode == 200) {
    
                return callback(null, result);
            }
        });
    }
    

    当然,您的示例代码实际上并不使用该数据,因此我添加了一个console.log来显示它 .

评论

暂时没有评论!