当前位置: 首页 > 面试题库 >

每个路由的节点Express特定超时值

滕祯
2023-03-14
问题内容

我正在使用Express v4.13.4开发Node v4.2.4应用程序。现在,我想增加特定上传路由的超时时间。

根据我的阅读和经验:

  • 默认的节点服务器超时为2分钟
  • 默认情况下,节点套接字没有超时
  • Express提供了中间件来处理超时

但是,当尝试为上载路由实现连接超时中间件时,我迷路了。

应用设置

const app = express();
app.use(cors());
app.use(bodyParser.json({ limit: '50mb' }));
app.use(bodyParser.urlencoded({ limit: '50mb', extended: false }));
app.use(passport.initialize());

app.use('/uploads', uploadRoutes);
app.use(errorHandler);

function errorHandler(err, req, res, next) {
  if (err.code && err.code === 'ETIMEDOUT') {
    if (!res.headersSent) {
      res
        .status(408)
        .send({
          success: true,
          message: 'Timeout error'
        });
    }
  }

  next(err);
}

const server = app.listen(config.port);

上传路线定义

router.route('/:uploadId/upload-files')
  .post(timeout('3m'),
    require('./actions/upload-files').prepareHandler,
    require('./actions/upload-files').uploadHandler(),
    require('./actions/upload-files').responseHandler);

但是,当我上传文件时,express-timeout仅在命令行控制台上3分钟后我才看到错误。该请求仍在进行中,没有返回状态码408。

4分钟后,我终于看到408状态和“超时错误”作为响应对象的一部分。

对于到其他路线的请求,我net::ERR_EMPTY_RESPONSE在4分钟后收到错误消息。

如果我记录的值server.timeout,则值为120000(2分钟)。

我的问题

  • 4分钟可能从哪里来?是否因为可能有一个先前的OPTIONS请求?
  • 服务器和套接字超时之间有什么区别,以及如何针对特定路由正确设置它们?

问题答案:

我已经使用以下路由配置解决了它:

'use strict';

const ms = require('ms');
const express = require('express');
const router = express.Router();

router.route('/upload-files')
  .post(
    setConnectionTimeout('12h'),
    require('./actions/upload-files').responseHandler
  );

function setConnectionTimeout(time) {
  var delay = typeof time === 'string'
    ? ms(time)
    : Number(time || 5000);

  return function (req, res, next) {
    res.connection.setTimeout(delay);
    next();
  }
}

exports.router = router;

其中的关键逻辑是以下中间件:

  function (req, res, next) {
    res.connection.setTimeout(delay);
    next();
  }

我希望此参考资料对其他人有用。



 类似资料:
  • Routing refers to how an application’s endpoints (URIs) respond to client requests. For an introduction to routing, see Basic routing. You define routing using methods of the Express app object that c

  • 本文向大家介绍Express的路由详解,包括了Express的路由详解的使用技巧和注意事项,需要的朋友参考一下 路由 路由是指如何定义应用的端点(URIs)以及如何响应客户端的请求。 路由是由一个 URI、HTTP 请求(GET、POST等)和若干个句柄组成,它的结构如下: app.METHOD(path, [callback...], callback), app 是 express 对象的一个

  • 我在一个测试类中配置了一个简单的路由如下所示: 这是我执行上述代码时camel生成的跟踪片段: 我可以做什么来简单地下载文件?

  • Routing refers to determining how an application responds to a client request to a particular endpoint, which is a URI (or path) and a specific HTTP request method (GET, POST, and so on). Each route c

  • 问题内容: 我想比较两个JSON字符串,它们是一个巨大的层次结构,并且想知道它们的值在哪里不同。但是某些值是在运行时生成的,并且是动态的。我想从比较中忽略那些特定的节点。 我目前正在使用来自 org.SkyScreamer的JSONAssert 进行比较。它为我提供了不错的控制台输出,但没有忽略任何属性。 对于前。 现在这是动态的,应该忽略。就像是 如果有人建议使用JSONAssert解决方案,那

  • 问题内容: 我有一个使用httprouter和negroni的Web服务器。用户通过外部OAuth登录此系统。我们将令牌保存到表明他们是否已登录的加密会话中。我想使用中间件来验证此令牌是否存在,如果不存在,则将用户踢回到登录页面。我想从身份验证中间件中排除一些路由。negroni自述文件中有一个使用大猩猩mux进行此操作的示例,但是我无法完全理解使用httprouter进行此操作的可扩展性。类似于