首页 > 解决方案 > Node.js 将值从一个 api 传递到另一个

问题描述

我需要从 API1 获取 "data":3 的值,如果字段 "data" 的值大于或等于 3,则检查 API2。我需要创建一个新的 API,其中 API2 字段单独通过过滤条件,请检查所需的 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" 
}
]

谢谢

标签: node.js

解决方案


由于您使用的是异步库,因此您需要使用该.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);
  });
}

如果您能够做到这一点,如果您能够使用 node.js 最新版本中提供的 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模块。

编辑

正如我在评论中提到的,您需要根据您当前的设计更新您的 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 来显示它的存在。


推荐阅读