如何将bodyParser上载限制设置为特定路由而不是中间件中的全局?

qod*_*nja 4 connect large-file-upload node.js express

这是一个示例(Express 3)中间件设置,它在全球范围内起作用:

app.configure(function () {
    app.use(express.static(__dirname + "/public"));
    app.use(express.bodyParser({
          keepExtensions: true,
          limit: 10000000, // set 10MB limit
          defer: true              
    }));
    //... more config stuff
}
Run Code Online (Sandbox Code Playgroud)

出于安全原因,我不想在路由之外允许500GB +帖子/upload,所以我试图弄清楚如何在特定路由上指定限制,而不是在中间件中全局指定.

我知道bodyParser()中多部分中间件已经嗅出了内容类型,但我想进一步限制它.

这在快递3中似乎不起作用:

app.use('/', express.bodyParser({
  keepExtensions: true,
  limit: 1024 * 1024 * 10,
  defer: true              
}));
app.use('/upload', express.bodyParser({
  keepExtensions: true,
  limit: 1024 * 1024 * 1024 * 500,
  defer: true              
}));
Run Code Online (Sandbox Code Playgroud)

Error: Request Entity Too Large当我尝试在uploadURL 上传3MB文件时出错.

你是怎么做到这一点的?

Ply*_*yto 12

实际上,如上面的六氰化物所示,app.use()限制单一途径.
问题来自路径路径的排序.
上面的示例,如果您'/upload'先放置,那么bodyParser应首先匹配该规则.

所以把代码这样(我使用的是Express 4.0 +):

app.use("/PATH_WITH_LIMIT", bodyParser({ 
    limit: 1024 * 1000
}));
app.use("/",bodyParser());
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看express如何在app.use()方法调用上绑定中间件.


hex*_*ide 1

使用时只需指定可选路径选项app.use()

app.use('/', express.bodyParser({
  keepExtensions: true,
  limit: 1024 * 1024 * 10,
  defer: true              
}));
app.use('/upload', express.bodyParser({
  keepExtensions: true,
  limit: 1024 * 1024 * 1024 * 500,
  defer: true              
}));
Run Code Online (Sandbox Code Playgroud)

  • 你确定这有效吗?当我尝试上传 3MB 文件时,收到一条错误消息“错误:请求实体太大”,根据您的代码,它应该接受 500GB (4认同)