49

我将 express 与 node.js 一起使用,并测试某些路由。我在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 上运行,所以我的延迟几乎为零)

4

8 回答 8

94

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

  app.use(function(req,res,next){setTimeout(next,1000)});
于 2013-11-13T13:22:36.323 回答
61

只需在setTimeoutres.send内部调用:

setTimeout((() => {
  res.send(items)
}), 2000)
于 2013-02-06T21:21:10.197 回答
5

尝试连接暂停模块。它会为您的应用程序中的所有或仅部分路由增加延迟。

于 2013-09-06T07:31:55.117 回答
4

要在所有请求上全局应用它,您可以使用以下代码:

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

时间值是:

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

最小值 = 100

于 2017-04-23T05:36:55.950 回答
3

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

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

于 2018-09-13T19:29:23.740 回答
2
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([])
})
于 2018-03-29T07:58:42.117 回答
1

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

暂停.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)
        });

});
于 2016-08-13T08:31:42.587 回答
0

您可以使用express-delay包。

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

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

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

于 2020-12-29T15:19:54.560 回答