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

时间:2018-12-10 12:30:00

标签: node.js

我需要从API1获取“ data”:3的值,并在API2中检查“ data”字段的值是否大于或等于3。我需要使用仅通过过滤器的API2字段创建新的API条件,请检查所需的Json:

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" 
}
]

谢谢

1 个答案:

答案 0 :(得分:0)

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

如果能够做到,那么如果您能够使用节点的最后几个版本中可用的异步/等待功能,遵循代码可能会更容易一些。如果可以的话,只需确保您的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以显示该数据。