Express 的 res.send() 传送问题

我想问一下各位,我想res.send那边延迟3秒传一次,我自己试过setTimeout()客户端传请求后,伺服器会没反应(传不上去),想请问各位怎么解决?
下面有程式码

var current_id = '6438cc71d6e3e690fbc8fc9c';

app.get('/data', (req, res) => {
  res.set('Access-Control-Allow-Origin', '*')
  res.set('Access-Control-Allow-Private-NetWork', 'true')
  res.set('Access-Control-Expose-Headers', 'ETag')

  const fishModel = mongoose.model('fishModel', fishSchema);
  fishModel.findOne({ _id: { $gt: current_id }}, function(err, nextDocument) {
    if (err) {
      // console.log(err);
      const data = { message: err }
      res.json(data)
      console.log(data)
      console.log("data");
    } else {
      // console.log(nextDocument);
      const jsonString = JSON.stringify(nextDocument.toObject());
      
      const jsonParse = JSON.parse(jsonString);
      current_id = jsonParse._id;

      console.log("---start---");
      res.send(jsonString);
      console.log(jsonParse);

      console.log("---end---");
    }
  });
})

如果您想在服务器发送响应之前延迟3秒钟,您可以在 res.send() 调用前使用 setTimeout() 函数将其延迟,如下所示:

app.get('/data', (req, res) => {
  res.set('Access-Control-Allow-Origin', '*')
  res.set('Access-Control-Allow-Private-NetWork', 'true')
  res.set('Access-Control-Expose-Headers', 'ETag')

  const fishModel = mongoose.model('fishModel', fishSchema);
  fishModel.findOne({ _id: { $gt: current_id }}, function(err, nextDocument) {
    if (err) {
      const data = { message: err }
      res.json(data)
      console.log(data)
      console.log("data");
    } else {
      const jsonString = JSON.stringify(nextDocument.toObject());
      const jsonParse = JSON.parse(jsonString);
      current_id = jsonParse._id;

      console.log("---start---");

      // 使用 setTimeout() 函数将 res.send() 延迟 3 秒钟
      setTimeout(() => {
        res.send(jsonString);
        console.log(jsonParse);
        console.log("---end---");
      }, 3000);
    }
  });
})

请注意,这会在3秒钟后响应所有客户端请求,不仅限于特定的客户端请求。如果您只想在特定的客户端请求上延迟响应,您需要为每个请求跟踪其独特的标识符并使用 setTimeout() 函数。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:
    app.get('/data', function(req, res) {
      setTimeout(() => {
        res.send({data: 'test'});
      }, 3000);
    });
    

    解决方案:

    可以使用Node.js中的stream技术来实现延迟发送数据。

    1. 使用Node.js内置的stream模块创建一个Writable流。
    const { Writable } = require('stream');
    const writable = new Writable({
      write(chunk, encoding, callback) {
        setTimeout(() => {
          res.write(chunk, encoding);
          callback();
        }, 3000)
      }
    });
    
    1. 将res对象的send方法替换为stream的写入方法。
    res.send = function(data) {
      writable.write(JSON.stringify(data));
      writable.end();
    };
    

    完整代码如下所示:

    const { Writable } = require('stream');
    
    app.get('/data', function(req, res) {
      const writable = new Writable({
        write(chunk, encoding, callback) {
          setTimeout(() => {
            res.write(chunk, encoding);
            callback();
          }, 3000)
        }
      });
      res.send = function(data) {
        writable.write(JSON.stringify(data));
        writable.end();
      };
      res.send({data: 'test'});
    });
    

    这样就可以实现延迟3秒发送数据了。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^