我实际上几乎没有 JS 背景,但我仍然需要通过运行 NodeJS 的 Web 服务器为当前项目进行一些通信。
以下任务:客户端发送 post 请求/route1 。服务器处理任务,但在响应之前,需要等待另一个客户端的post请求/route2。
我该怎么做?
我发现了一些关于 promise 和等待/异步的内容,但我并不完全理解它,并且不确定这是否真的是我正在寻找的。
app.post('/route1', function (req, res) {
//send a respond only after /route2 was called
});
app.post('/route2', function (req, res) {
})
最佳答案
前言: 让 POST 响应在发送之前等待另一个 POST 似乎是一个有问题的设置。我建议尽可能避免它。
<小时/>您需要一种方法来关联请求,以便我们知道哪个 /route2
请求满足之前的哪个 /route1
请求。您可以通过以下方式做到这一点
假设当前
/route2
请求应该满足最后一个/route1
请求(这很简单,但看起来很脆弱)在请求中包含标识信息(某种通用 ID)
然后将请求/响应存储在函数之外。如果您选择上面的#1,则只需要一个变量:
let lastRoute1 = null;
app.post('/route1', (req, res) => {
lastRoute1 = {req, res};
});
app.post('/route2', (req, res) => {
if (!lastRoute1) {
// Error, we were expecting a previous /route1 request
} else {
// Send response via `lastRoute1.res` (and presumably respond here, too, via `res`)
// Done with it
lastRoute1 = null;
}
});
但同样,这似乎很脆弱。也许是未完成请求的Map
:
let route1Requests = new Map();
app.post('/route1', (req, res) => {
const id = /*...get ID from `req`...*/;
route1Requests.set(id, {req, res, tstamp: Date.now()});
});
app.post('/route2', (req, res) => {
const id = /*...get ID from `req`...*/;
const route1 = route1Requests.get(id);
if (!route1) {
// Error, we were expecting a previous /route1 request
} else {
// Send response via `route1.res` (and presumably respond here, too, via `res`)
// Done with it
route1Requests.remove(id);
}
});
也许添加一个计时器来对尚未处理的事件进行超时...
关于javascript - 等待另一个请求再响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56900392/