【问题标题】:Add intentional latency in express在 express 中添加故意延迟
【发布时间】:2013-02-06 20:30:39
【问题描述】:

我在 node.js 中使用 express,并测试某些路由。我正在http://coenraets.org/blog/2012/10/creating-a-rest-api-using-node-js-express-and-mongodb/做这个tute@

我通过 ajax 调用http://localhost:3000/wines(内容无关紧要)。但我想测试延迟。我可以在 2 秒后做类似做出快速响应的事情吗? (我想模拟 ajax 加载器,我在 localhost 上运行,所以我的延迟几乎为零)

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    用作中间件,满足您的所有请求

      app.use(function(req,res,next){setTimeout(next,1000)});
    

    【讨论】:

    • 使用它,谢谢,as es6: app.use((req, res, next) => setTimout(next, 1000))
    • @ya_dimon,setTimout 拼写错误,应该是setTimeout
    • 订单对我来说很重要。在设置 static 文件中间件之前设置延迟中间件(在我的情况下,我想延迟此类静态资产)
    • 就是这么简单。我不明白为什么我以前没有想到这一点。谢谢!
    【解决方案2】:

    只需在setTimeout 内调用res.send

    setTimeout((() => {
      res.send(items)
    }), 2000)
    

    【讨论】:

      【解决方案3】:

      试试connect-pause 模块。它会为您的应用中的所有或仅部分路由增加延迟。

      【讨论】:

      【解决方案4】:

      要将其应用于所有请求,您可以使用以下代码:

      app.use( ( req, res, next ) => {
          setTimeout(next, Math.floor( ( Math.random() * 2000 ) + 100 ) );
      });
      

      时间值是:

      Max = 2000(有点....最小值被添加,所以实际上它是 2100)

      最小值 = 100

      【讨论】:

      • 与 Lodash:app.use((req, res, next) => setTimeout(next, random(100, 2000)))
      • 仅用于随机函数的 70kb 库?
      • 可以使用npmjs.com/package/lodash.random。同样使用 ES6 模块,cherry pick 只能导入所需的依赖项。我到处使用 Lodash。
      【解决方案5】:

      只需在@maggocnx 的解决方案上添加注释:尽早放置此中间件(在您的路由处理程序之前)

      app.use(function(req,res,next){setTimeout(next,1000)});

      【讨论】:

        【解决方案6】:
        app.get('/fakeDelay', function(req,res){
            let ms = req.query.t;
            ms = (ms>5000 || isNaN(ms)) ? 1000 : parseInt(ms); 
            setTimeout((()=> res.status(200).send({delay:ms})), ms);
        })
        

        然后请求 URL 为:http://localhost/fakeDelay/?t=2000 (本例中最多 5000 毫秒,默认为 1000 毫秒)

        更新: 使用承诺。函数 'sleep' 可用于延迟任何 Express 响应或其他异步函数。

        const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
        
        app.get('/fakeDelay', async (req, res) => {
          await sleep(500);
          res.send([])
        })
        

        【讨论】:

          【解决方案7】:

          您也可以使用 Promise 或回调(在本例中使用 q 承诺)编写自己的通用延迟处理程序:

          pause.js:

          var q = require('q');
          
          function pause(time) {
              var deferred = q.defer();
          
              // if the supplied time value is not a number, 
              // set it to 0, 
              // else use supplied value
              time = isNaN(time) ? 0 : time;
          
              // Logging that this function has been called, 
              // just in case you forgot about a pause() you added somewhere, 
              // and you think your code is just running super-slow :)
              console.log('pause()-ing for ' + time + ' milliseconds');
          
              setTimeout(function () {
                  deferred.resolve();
              }, time);
          
              return deferred.promise;
          }
          
          module.exports = pause;
          

          然后随心所欲地使用它:

          server.js:

          var pause = require('./pause');
          
          router.get('/items', function (req, res) {
              var items = [];
          
              pause(2000)
                  .then(function () {
                      res.send(items)
                  });
          
          });
          

          【讨论】:

          • 它比通用的setTimeout 好在哪里?
          【解决方案8】:

          您可以使用express-delay 包。

          下面的代码会将所有传入的请求延迟一秒。

          const app = require('express')();
          const delay = require('express-delay');
          app.use(delay(1000));
          

          该软件包还提供了在指定边界内引入随机延迟的可能性,例如通过调用delay(1000, 2000) 延迟一到两秒。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-03-18
            • 1970-01-01
            • 2018-01-02
            • 1970-01-01
            • 2018-01-19
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多