实际上我几乎没有JS背景,但是对于当前项目,我仍然需要通过运行NodeJS的WebServer进行一些通信。
以下任务:客户端发送发布请求/ route1。服务器处理任务,但是在响应之前,它需要等待另一个客户端的发布请求/ route2。
我该怎么做?
我发现了一些关于Promise和await / async的信息,但是我并不完全理解,也不确定这是否是我真正想要的。
app.post('/route1', function (req, res) {
//send a respond only after /route2 was called
});
app.post('/route2', function (req, res) {
})
答案 0 :(得分:2)
序言:让POST响应等待另一个POST才能发送,这似乎是一个有问题的设置。我建议尽可能避免使用它。
您需要一种关联请求的方式,因此我们知道哪个/route2
请求满足哪个先前的/route1
请求。您可以通过
假定当前的/route1
请求应满足最后一个/route2
请求(这很简单,但似乎很脆弱)
在请求中包含标识信息(某种通用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);
}
});
也许添加一个计时器以对尚未处理的计时器进行超时...
答案 1 :(得分:1)
您可以将事件发射器用于此任务。但是我不认为这项任务依赖于现实世界。因为您有两个可以连接多个客户端的服务。因此这意味着其他客户也必须等待。因此,对于给定的任务,您可以使用以下示例:
const myEmitter = new MyEmitter();
app.post('/route1',(req, res) => {
myEmitter.on('event', (message) => {
res.send(message);
});
});
app.post('/route2', (req, res) => {
myEmitter.emit('event', 'message from route 2');
res.send('route 2 sent message to route 1');
})
更好的方法是使用 WebSockets 。