javascript - 等待另一个请求再响应

标签 javascript node.js

我实际上几乎没有 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 请求。您可以通过以下方式做到这一点

  1. 假设当前 /route2 请求应该满足最后一个 /route1 请求(这很简单,但看起来很脆弱)

  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);
    }
});

也许添加一个计时器来对尚未处理的事件进行超时...

关于javascript - 等待另一个请求再响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56900392/

相关文章:

javascript - Joomla 页面 : "The type attribute is unnecessary for JavaScript resources." 的 W3C 验证

javascript - Angular - 如何对不同类型的错误进行动态警报?

javascript - 从导出的模块返回变量并在另一个文件(NodeJS)中使用它

javascript - jquery ajax 在地址栏中返回查询字符串

javascript - 只是好奇如何继承 String 对象。 (原型(prototype))

javascript - 获取库中的文件(汇总)

javascript - HTML 内容更新未显示在 ionic 中

javascript - 如何使用 phantom-crawler 将 html 源代码打印到控制台

angularjs - 如何以 Angular 读取nodejs流?

javascript - 使用 Jest 和 @std/esm 模拟 Node 模块