Javascript 如何在服务器端提取req.body(I';m使用fetch)?

Javascript 如何在服务器端提取req.body(I';m使用fetch)?,javascript,node.js,express,Javascript,Node.js,Express,我正在做一个项目,包括独立的前端和后端。从前端,我通过fetch发出POST请求,该请求应向后端发送字符串“ORANGE”,然后后端应将其记录到控制台。我无法让后端控制台记录字符串。我在devtools中查看了请求,字符串“ORANGE”被隐藏在“requestpayload”下面。请求本身发送得很好。如何实际访问字符串以便使用它进行操作?(例如,存储在数据库中) 尝试以下操作: 在server.js文件中使用主体解析器 将post请求作为内容类型作为json发送,如下所示 headers:{C

我正在做一个项目,包括独立的前端和后端。从前端,我通过fetch发出POST请求,该请求应向后端发送字符串“ORANGE”,然后后端应将其记录到控制台。我无法让后端控制台记录字符串。我在devtools中查看了请求,字符串“ORANGE”被隐藏在“requestpayload”下面。请求本身发送得很好。如何实际访问字符串以便使用它进行操作?(例如,存储在数据库中)

尝试以下操作:

  • 在server.js文件中使用主体解析器

  • 将post请求作为
    内容类型
    作为
    json
    发送,如下所示

    headers:{Content-Type:application/json}

  • 主体应该是JSON

    正文:{“颜色”:“橙色”}

  • 在你的路线上只需打印

    console.log(要求主体颜色)

  • 正如在fetch()中所解释的:

    这只是一个HTTP响应,而不是实际的JSON。提取JSON主体 从响应内容中,我们使用json()方法(在Body mixin上定义, 它由请求和响应对象实现。)


    因此,您的响应中没有body对象,只有一个json对象,即您的body。

    Express默认情况下不会处理请求的body。您需要加载一个模块来显式地执行此操作

    因为您使用的是纯文本,所以可以使用body解析器模块。这将在请求上创建一个
    body
    属性:

    const bodyParser = require('body-parser');
    router.use(bodyParser.text({type: 'text/plain'}))
    router.post('/posts/:id', function(req, res, next) {
        console.log(req.body);
        res.send('Response')
    });
    

    但是,请注意,通常最好使用JSON之类的结构化数据格式,而不是纯文本。

    在Express 4.16中,不再需要主体解析器模块。获得身体所需的一切是:

    app.use(express.urlencoded({ extended: true }));
    app.use(express.json());
    

    使用
    “内容类型”:“application/x-www-form-urlencoded”
    ,否则CORS将发送预飞行,给您带来困难。(有关此google CORS简单请求要求的更多信息)。

    关于
    console.log(req.body)
    ?req.body是未定义的。过去,req.body在请求中有一个rawBody属性,但该属性已被删除,现在所有请求体都应使用JSON。如果你想发送纯文本正文,你必须实现你自己的中间件,如回答中所述:你需要用一个实际的id替换:id in.@jperl,这在路由使用该参数做任何事情时都是必要的,但这并不能阻止正文的可用性;它将把req.params.id绑定到字符串
    :id
    const bodyParser = require('body-parser');
    router.use(bodyParser.text({type: 'text/plain'}))
    router.post('/posts/:id', function(req, res, next) {
        console.log(req.body);
        res.send('Response')
    });
    
    app.use(express.urlencoded({ extended: true }));
    app.use(express.json());