node.js - 在 Node JS 中处理多个 HTTP 请求
问题描述
问题陈述:考虑一个使用 express 库运行的 node js 程序,用于 REST 通信。有多个 REST API 调用,所有 API 都使用单个阻塞资源,该资源一次只能运行一个请求,例如串行端口。
我有一种情况,我收到对 API 调用的多个并行请求,这些请求又出于某种目的使用串行端口。
如何引导来自不同方法的 API 调用,然后对其进行简化,然后一一执行,然后将响应返回给相应的请求?
代码片段:
/**
* This function is a blocking function that utilizes the serial port
*/
function request_response(shield, channel, parameter, parameterValue) {
var promise = new Promise(function (resolve, reject) {
var commandString = modbusRTURequestGenerator.modbusRTURequestGenerator(shield, channel, parameter, data, parameterValue);
serialOUT(commandString).then(() => {
Promise.race([serialIN(), timeOut()]).then(results => {
resolve(results);
});
});
});
return promise;
}
/**
* This is a GET Request API to get the parameter values.
*/
router.get("/getParameter", function (req, res) {
var shield = req.query.shield;
var channel = req.query.channel;
var parameter = req.query.parameter;
request_response(shield, channel, parameter, undefined).then(
(result) => {
res.send(result);
});
});
/**
* This is a POST Request API to set the parameter values.
*/
router.post("/setParameter", function (req, res) {
var shield = req.query.shield;
var channel = req.query.channel;
var parameter = req.query.parameter;
var parameterValue = req.body.value;
request_response(shield, channel, parameter, parameterValue).then(
(result) => {
res.send(result);
});
});
/**
* This is a GET Request API for Scan functionality.
*/
router.get("/scan", function (req, res) {
var msg = {};
var cmds_arr = [];
for (var i = 1; i <= constants.NUMBER_OF_SHIELDS; i++) {
cmds_arr.push(i + "," + constants.SCAN_COMMAND_REGISTER);
}
asyncLoop(cmds_arr, function (item, next) {
var params = item.split(",");
var shield = params[0];
var register = params[1];
request_response(shield, undefined, register, undefined).then(
(result) => {
msg[data] = result;
next();
}
});
}, function () {
res.send(msg);
});
});
有 3 种 HTTP REST API:scan、getParameter 和 setParameter。所有这 3 个都在访问 request_response 函数。因此,当我运行扫描 API 然后并行触发 getParameter API 时,我得到了错误的结果。
解决方案
推荐阅读
- python - How to get average of multiple lists within certain range in python?
- python - How to reset index on concatenated dataframe in Dask
- c++ - Add color array to vtkImageData C++
- javascript - convert firestore promise to synchronous function
- excel - 将宏分配给excel中的图像
- android - 工具栏菜单 onOptionsItemSelected 在片段中不起作用
- python - 如何在 Pytest 3.0.7 中并行动态运行一些测试
- windows - 本地组成员身份在重新登录后才更新
- django - Django REST Framework - API 身份验证 - 授权应用程序而不是用户
- amazon-web-services - 通过 API 网关和 Lambda 将文档上传到 S3 存储桶会损坏文档