http请求对象上的node.js正文与express请求对象上的正文

http请求对象上的node.js正文与express请求对象上的正文,node.js,sockets,http,express,Node.js,Sockets,Http,Express,我正在尝试构建一个http模块,该模块假定与express服务器一起工作 在阅读http模块api时,我看到它没有将主体保存在请求对象中。 因此,我的问题是: 如果我想构建一个与官方http模块一起工作的express服务器,我应该如何获得主体 Li >我想通过下面的方式来实现 HTTP模块:监听套接字,如果得到内容长度

我正在尝试构建一个http模块,该模块假定与express服务器一起工作

在阅读http模块api时,我看到它没有将主体保存在请求对象中。 因此,我的问题是:

  • 如果我想构建一个与官方http模块一起工作的express服务器,我应该如何获得主体
  • <> Li >我想通过下面的方式来实现<代码> HTTP模块:监听套接字,如果得到内容长度 与让express服务器通过request.on('data',callback(data))来“监听”请求主体相比,我上面的建议有哪些利弊


    我的意思是,为什么我不能像保留标题一样将主体保留在“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());