http请求对象上的node.js正文与express请求对象上的正文
我正在尝试构建一个http模块,该模块假定与express服务器一起工作 在阅读http模块api时,我看到它没有将主体保存在请求对象中。 因此,我的问题是:http请求对象上的node.js正文与express请求对象上的正文,node.js,sockets,http,express,Node.js,Sockets,Http,Express,我正在尝试构建一个http模块,该模块假定与express服务器一起工作 在阅读http模块api时,我看到它没有将主体保存在请求对象中。 因此,我的问题是: 如果我想构建一个与官方http模块一起工作的express服务器,我应该如何获得主体 Li >我想通过下面的方式来实现 HTTP模块:监听套接字,如果得到内容长度
我的意思是,为什么我不能像保留标题一样将主体保留在“request”对象中?你可以这样做,这相当简单
bodyParser
中间件就是这样做的,例如()。问题是,请求主体可能非常大(例如,文件上传),所以您通常不想将其放在内存中。相反,您可以将其流式传输到磁盘、s3或诸如此类的地方。如果不知道您想要做什么,很难回答您的问题。但是我可以给你一些关于Node/Express如何处理请求体的细节,希望你能从中吸取教训
处理请求时(直接通过节点的请求处理程序,或通过Express的请求处理程序),不会自动接收请求体:您必须打开HTTP流才能接收请求
正文内容的类型应由内容类型
请求头确定。最常见的两种主体类型是application/x-www-form-urlencoded
和multipart/form data
。但是,可以使用您想要的任何内容类型,这在API中通常更常见(例如,使用application/json
在RESTAPI中越来越常见)
application/x-www-form-urlencoded
非常简单name=value
对是URL编码的(例如,使用JavaScript的内置encodeURIComponent
),然后与符号(&)组合。它们通常是UTF-8编码的,但也可以在内容类型中指定
正如vkurchatkin的回答所指出的那样,多部分/表单数据
更为复杂,通常也可能相当大(这意味着您可能不想将其放入内存)
Express提供了一些中间件来自动处理各种类型的正文解析。通常,人们只是简单地使用bodyParser
,尽管您必须小心使用该中间件。它实际上只是一个方便的中间件,结合了json
、urlencoded
和multipart
。但是,multipart
已被弃用。Express仍在捆绑Connect 2.12,它仍然包括多部分
。但是,当Express更新其依赖项时,情况将发生变化
在我写这篇文章时,bodyParser
、json
、urlencoded
和multipart
都已从Connect中删除。除了multipart
之外的所有内容都已移动到模块body parser
()。如果您需要多部分支持,我推荐Busboy(),它非常健壮。在某个时刻,Express将更新其对Connect的依赖关系,并且很可能会将依赖关系添加到主体解析器中,因为它已从Connect中删除
因此,由于bodyParser
捆绑了不推荐使用的代码(multipart
),我建议只显式链接json
和urlencoded
(如果不接受任何json编码的体,甚至可以省略json
):
如果您正在编写中间件,您可能不想自动链接到json
和urlencoded
(更不用说Busboy了);这将打破Express的模块化特性。但是,您应该在您的文档中指定,您的中间件要求req.body
对象可用(如果不可用,则会优雅地失败):您可以继续说json
、urlencoded
和Busboy都提供req.body
对象,取决于您需要接受的内容类型
如果深入研究urlencoded
或json
的源代码,您会发现它们依赖于另一个节点模块raw body
,该模块只需打开请求流并检索body内容。如果您确实需要了解从请求中检索正文的详细信息,您将在该模块()的源代码中找到所需的一切
我知道这是很多细节,但它们是重要的细节 请求正文-您是指POST数据吗?是的,例如。是要获取正文数据,您必须自己解析请求正文。您的方法是合理的,但是为什么不使用express提供的解析器呢?是什么阻止你这么做的?
app.use(express.json());
app.use(express.urlencoded());