- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我是 node.js 和 express 的新手,并且已经尝试了一段时间。现在我对与解析请求正文相关的 express 框架的设计感到困惑。来自express官方指南:
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(logErrors);
app.use(clientErrorHandler);
app.use(errorHandler);
设置好所有中间件后,我们添加我们要处理的路由:
app.post('/test', function(req, res){
//do something with req.body
});
这种方法的问题是在检查路由有效性之前会先解析所有请求正文。解析无效请求的主体似乎非常低效。更重要的是,如果我们启用上传处理:
app.use(express.bodyParser({uploadDir: '/temp_dir'}));
任何客户端都可以通过上传任何文件(通过向任何路由/路径发送请求!!)来轰炸服务器,所有这些都将被处理并保存在“/temp_dir”中。我不敢相信这种默认方法正在被广泛推广!
我们当然可以在定义路由的时候使用bodyParser函数:
app.post('/test1', bodyParser, routeHandler1);
app.post('/test2', bodyParser, routeHandler2);
甚至可能在处理路由的每个函数中解析主体。但是,这样做很乏味。
有没有更好的方法让 express.bodyParser 只用于所有有效(已定义)的路由,并且只在选定的路由上使用文件上传处理功能,而无需大量重复代码?
最佳答案
您的第二种方法很好。请记住,您还可以将中间件函数数组传递给 app.post
、app.get
和 friend 。因此,您可以定义一个名为 uploadMiddleware
的数组,其中包含处理 POST 正文、上传等的东西,并使用它。
app.post('/test1', uploadMiddleware, routeHandler1);
这些示例适用于初学者。帮助您在第一天就开始工作的初学者代码和高效且安全的生产代码通常是非常不同的。关于不接受上传到任意路径,您提出了一个肯定有效的观点。至于解析所有“非常低效”的请求主体,这取决于无效/攻击 POST 请求与发送到您的应用程序的合法请求的比率。在您的网站开始流行之前,可能不足以担心攻击探测请求的平均背景辐射。
Also here's a blog post with further details of the security considerations of bodyParser.
关于Node.js 表达了对 bodyParser 中间件的正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12418372/
我希望 Eclipse 调试器观察某个表达式何时变为真(其值发生变化)并在发生这种情况时停止。这在我看来非常有用和基本,所以我认为必须有一种方法可以在 eclipse 中做到这一点(如在 gdb 中)
我正在使用 SPEL 表达式,当我的应用程序启动时,我收到此错误。 ftpOutboundGateway.setRenameExpressionString("'/processed/headers[
我不是 visual studio 程序员,但我需要快速创建一个应用程序来显示图像并使用 slider 操纵它的高度和宽度。我已经完成了快速谷歌和所有关于使用 picturebox(picbox) 作
我在玩弄 Boost Xpressive,但遇到了以下代码片段的问题 #include #include #include using namespace std; using namespac
今年我一直在想,2022年我想做些什么,做哪方面的改变,这周末在家终于想到了! 2021 轻描淡写 年底就一直想对2021年写一篇总结的,起码不得写个千八百字,可是思来想去不知道怎么写,直到最后都没想
这个问题在这里已经有了答案: Italic greek letters / latex-style math in plot titles (2 个回答) 8年前关闭。 我应该怎么做才能让 R 在图例
有没有办法为 jade 模板错误提供自定义异常处理程序? 例如 // server.js app = express(); app.set('view engine', jade); app.loca
我需要了解使用路由在 Express 应用程序中流程的工作原理,我有这些路线 app.use(require('./routes/reportsRouter')); app.use(require('
在一条 route 我有这个: if (elements.length <= 0) { var msg = 'no elements found
完整的代码如下 - 很简单,我想添加、删除或更新帖子 - 当我自己做其中一件事时,它可以工作,但一起它会中断 我在 NodeJS MySQL 中搜索了很多我用它来查询数据库 var mysql = r
下面的CSS选择器有没有更优雅的写法? input:not([type="image"]):not([type="submit"]) 我想匹配所有不是 image 类型或 submit 类型的 HTM
当我尝试全局安装 express-generator 时,它说它成功了。我什至可以在我的全局应用程序列表中看到它但是当我尝试运行 express我遇到标题问题:zsh: command not fou
这不是一个很好的问题,但它是这样的: 我正在结合 DataFrame 的几列进行非常简单的计算,但前提是一列具有特定值。想法是: if df.x==1: df.y = df.y - df.a/
我有一个网站 -https://example.com- 调用 API -https://api.example.com-。该 API 是用 Express 编写的,其使用 CORS package允
当我使用 Express 框架时,我将“.html”文件放入文件夹 View 中,然后将“.js”和“.css”文件放入 public 中。当我运行我的应用程序时,我可以获得 js 和 css,但我无
有一个简单的应用程序 var express = require('express'); var http = require('http'); var path=require('path'); v
我正在构建一个基于express的REST API,我想在用户的请求中使用错误的HTTP动词时发出警告。 目前,我正在添加 app.all('/', (req, res) => { answe
对于用于在 connect/express 中对 session 数据进行加密散列的 key 长度有什么建议吗?我看到了从 60 多个字符串到规范的“键盘猫”的所有内容。 对于我的直接用例,我打算对整
Redis 的HDEL 的时间复杂度是O(N)(其中N 是要移除的字段数)。我有一个用例,其中字段必须为每个操作进行类型转换。我将如何表达新的时间复杂度? O(N*2)? 最佳答案 时间复杂度将相同:
我看到我可以像这样指定 gradle 依赖项: dependencies { compile 'com.fasterxml.jackson.core:jackson-annotations:2
我是一名优秀的程序员,十分优秀!