【问题标题】:Increase body limit for specific route with ExpressJS使用 ExpressJS 增加特定路线的正文限制
【发布时间】:2022-11-11 21:44:44
【问题描述】:

我们有一个用 ExpressJS 构建的 REST API。我们的路线之一是在 JSON 请求正文中获取文件作为二进制数据。所以我们要增加身体的极限。

我们的起始 index.js 文件的简单版本

const start = async () => {
    try {
        // Connect to database
        await connectDB(process.env.DATABASE_URL);

        // Create app
        const app = express();

        // Body parser
        app.use(express.json()); //100kb default
        app.use(express.urlencoded({ extended: true }));

        // Mount routes
        app.use(`/${process.env.API_VERSION}`, authRoutes);
        app.use(`/${process.env.API_VERSION}`, profileRoutes);
        app.use(`/${process.env.API_VERSION}`, filesRoutes);
        app.use(`/${process.env.API_VERSION}`, ticketRoutes);

        // Error handler
        app.use(errorHandler);

        // Not found handler
        app.use(notFoundHandler);

        // Start server
        const server = app.listen(process.env.PORT, () => {
            console.log(`Server running in ${process.env.NODE_ENV} mode on http://${process.env.HOST}:${process.env.PORT}/${process.env.API_VERSION}`)
        });

    } catch(error) {
        console.log(error);
    }
}

start();

此时所有路由的限制为 100kb。

在我们的filesRoutes 中,我们有 1 个特定的上传路径,我们希望将这个限制增加到 200mb。

import express from 'express';
import { uploadFiles, getFiles, downloadFile, deleteFile } from '../controllers/filesController.js';
import authorize from '../middleware/authorizeHandler.js';

const router = express.Router();

router.get('files', authorize, getFiles);
router.get('files/:id/download', authorize, downloadFile);
router.post('files/upload', [authorize, express.json({ limit: '200mb' })], uploadFile);
router.delete('files/:id', authorize, deleteFile);

export default router;

我在上传路径中添加了express.json({ limit: '200mb' }),但我收到了一个错误回复request entity too large

【问题讨论】:

  • 那是因为你在index.js 文件中有这个:app.use(express.json());。这适用于所有路线
  • 您可以在app.use 中使用pass a path,它也接受正则表达式。您可以添加一个接受所有路径的正则表达式,uploadBinary 文件中的 uploadBinary 路径除外。
  • 更好的性能方法是使用文件流上传大文件并管道请求以获取块中的数据
  • @vighnesh153 我希望我们可以覆盖特定路由的中间件。我们将检查编写一个正则表达式。谢谢!
  • @BrijeshDave:这不是一个选择。客户端希望在一个请求中将二进制内容作为 json 发送

标签: node.js express


【解决方案1】:

根据@vighnesh153 评论,我们可以通过将app.use(express.json()); 更改为app.use(/^(?!/api/files/upload$)/, express.json()); 并将express.json({ limit: '200mb' }) 作为中间件添加到api/files/upload 路由来解决此问题

【讨论】:

    猜你喜欢
    • 2019-11-13
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多