fetch 配合 express 使用req body为空

简介: 最近用 node 写后端接口 前端使用fetch,遇到个问题记录如下使用fetch进行post请求的时候,后端node 使用express框架进行body接收的时候始终是个空对象 {}

1. 前言


最近用 node 写后端接口 前端使用fetch,遇到个问题记录如下

使用fetch进行post请求的时候,后端node 使用express框架进行body接收的时候始终是个空对象 {}


2.后端代码



const express = require('express');
let app = express()
app.use(express.json()) // for parsing application/json
app.use(express.urlencoded({ extended: true })) // for parsing application/x-www-form-urlencod
//*************post 
app.post("/login",(req,res)=>{
    console.log("post------body",req.body)
    res.json({msg:"登录成功",code:1000})
})



3.前端代码


<button onclick="loginFn()"> 登录 -post</button>



let loginFn = async () => {
            let res = await fetch("/login", {
                method: "POST",
                body: JSON.stringify({ name: "1-1-1" }),
            }).then(res => res.json())
            console.log("post 结果:", res)
        }

T2P}KHSK]16E@RBG17}QWL2.png



4. 解决办法 配置请求头


headers 配置


let res = await fetch("/login", {
                method: "POST",
                body: JSON.stringify({ name: "yzs",password:"123456" }),
                headers: {
                    'Content-Type': 'application/json;charset=utf-8'
                }
            }).then(res => res.json())

0ZLI6J0OP8D8]0QOGDK6FRP.png



5.原因 找到了 MDN



fetch(url, {
    body: JSON.stringify(data), // must match 'Content-Type' header
    cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
    credentials: 'same-origin', // include, same-origin, *omit
    headers: {
      'user-agent': 'Mozilla/4.0 MDN Example',
      'content-type': 'application/json'
    },
    method: 'POST', // *GET, POST, PUT, DELETE, etc.
    mode: 'cors', // no-cors, cors, *same-origin
    redirect: 'follow', // manual, *follow, error
    referrer: 'no-referrer', // *client, no-referrer
  })
  .then(response => response.json())


body的数据类型 必须和 content-Type匹配

但是这个fetch默认的类型是text/plain ,这个需要的是纯文本

]QWQ6]U7R1(U_V[1XIC5DFW.png

所以必须手动设置请求头


headers: {
                   'Content-Type': 'application/json;charset=utf-8'
                }



6.扩展


key-value形式对应的 content-type配置


headers: {
    "Content-type": "application/x-www-form-urlencoded; charset=UTF-8",
  },
    body: 'name=yzs&password=123456'





相关文章
|
8月前
|
JSON 数据格式
Nestjs(三)接收参数 @Query @Body @Param(post、get 、put、delete ...)
Nestjs(三)接收参数 @Query @Body @Param(post、get 、put、delete ...)
570 4
Request failed with status code 400,使用axios.post要发送参数,认真比对原项目,看看有没有忘记什么?
Request failed with status code 400,使用axios.post要发送参数,认真比对原项目,看看有没有忘记什么?
传参接受res.data数值,如何将获取request的请求进行传参
传参接受res.data数值,如何将获取request的请求进行传参
|
7月前
|
数据采集 监控 JavaScript
函数计算操作报错合集之调用时报错:Error parsing headers: 'limit request headers fields',是什么原因
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
|
前端开发 JavaScript 安全
AJAX - $().load(url,data,function(response,status,xhr))
AJAX - $().load(url,data,function(response,status,xhr))
60 0
node.express中req.body总是undefind解决
node.express中req.body总是undefind解决
117 0
axios文件上传和 Content-Type类型介绍
axios文件上传和 Content-Type类型介绍
|
8月前
|
Web App开发 前端开发 JavaScript
AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
79 0
|
前端开发 数据库
浅谈Ajax请求中的GET,POST,PUT,DELETE,PATCH,OPTIONS
浅谈Ajax请求中的GET,POST,PUT,DELETE,PATCH,OPTIONS 在日常的前后端交互,数据请求中最长用的就是Ajax,当然在面试时也经常会被问道请求的方式有哪些?分别什么不同?一般我们都会回答GET请求和POST请求,但其实在后端配置接口时,请求方式不仅这两种,还会有PUT,DELETE,PATCH等,当然我们在开发的时候偶尔也会遇到接口要求使用这几种方式进行请求,下面我们就来讲一讲这几种方式分别有什么不同。 首先先要了解http定义与服务器进行交互的方式,其中基本的有GET,POST,PUT,DELETE,PATCH是后增的方式。同时还要知道URL代表的是 统一资源
浅谈Ajax请求中的GET,POST,PUT,DELETE,PATCH,OPTIONS
|
XML JSON 数据格式
【Gin】gin json渲染,获取querystring参数,获取form参数,获取path参数,参数绑定
访问:http://localhost:9090/user?username=dahe&password=admin 控制台输出:main.UserInfo{Username:“dahe”, Password:“admin”} ShouldBind会按照下面的顺序解析请求中的数据完成绑定: 如果是 GET 请求,只使用 Form 绑定引擎(query)。 如果是 POST 请求,首先检查 content-type 是否为 JSON 或 XML,然后再使用 Form(form-data)。
240 0
【Gin】gin json渲染,获取querystring参数,获取form参数,获取path参数,参数绑定