node.js - 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"
}
]
谢谢
解决方案
由于您使用的是异步库,因此您需要使用该.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 来显示它的存在。
推荐阅读
- r - 一种执行多个成对测试(例如 t 测试)的紧凑方法,其中单个变量以长格式拆分为多个类别
- xcode - 如何防止 Xcode Archive 包含我的子项目的产品?
- r - 包包装“odbc”不适用于全局连接
- python-3.x - 列出具有相同宽度的值
- git - 远程 url 环境变量
- c# - Outlook.MailItem 自定义属性问题
- python - 如何在 python 中使用 selenium 从 RadioButtons 中进行选择?
- java - 合并两个 WebElements 列表
- dojo - 将 JSON 数据发送到我的自定义类中的方法
- typescript - TypeScript 中的抽象函数导致类型之间的不兼容