【发布时间】: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 发送