等待其他请求后再回复

时间:2019-07-05 09:34:53

标签: javascript node.js

实际上我几乎没有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) {


})

2 个答案:

答案 0 :(得分:2)

序言:让POST响应等待另一个POST才能发送,这似乎是一个有问题的设置。我建议尽可能避免使用它。


您需要一种关联请求的方式,因此我们知道哪个/route2请求满足哪个先前的/route1请求。您可以通过

  1. 假定当前的/route1请求应满足最后一个/route2请求(这很简单,但似乎很脆弱)

  2. 在请求中包含标识信息(某种通用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