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'





相关文章
|
6月前
uView queryParams 对象转URL参数
uView queryParams 对象转URL参数
65 0
|
6月前
|
XML JSON API
高效使用 Postman:如何正确传递 Query、Path 和 Body 参数
Postman 作为一个功能强大的工具,极大地简化了 API 测试和调试的过程,提供了发送请求和检查响应的直接方法。本文将着重介绍如何在 Postman 中高效地处理请求参数,以提高 API 测试和开发的便利性。
|
6月前
|
JSON 数据格式
Nestjs(三)接收参数 @Query @Body @Param(post、get 、put、delete ...)
Nestjs(三)接收参数 @Query @Body @Param(post、get 、put、delete ...)
477 4
Request failed with status code 400,使用axios.post要发送参数,认真比对原项目,看看有没有忘记什么?
Request failed with status code 400,使用axios.post要发送参数,认真比对原项目,看看有没有忘记什么?
|
4月前
|
JavaScript 网络架构
vue 使用 this.$router.push 传参数,接参数的 query或params 两种方法示例
vue 使用 this.$router.push 传参数,接参数的 query或params 两种方法示例
208 4
node.express中req.body总是undefind解决
node.express中req.body总是undefind解决
107 0
|
JavaScript
node.js如何获取post和get请求的参数
node.js如何获取post和get请求的参数
99 0
|
6月前
|
Web App开发 前端开发 JavaScript
AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式
72 0
thinkphp报错Call to undefined method app\index\controller\Index::fetch()
thinkphp报错Call to undefined method app\index\controller\Index::fetch()
168 0
|
中间件
Koa2 接收post时,body值undefined
本来想通过koa快速搭建一个简单的服务时并测试文件上传的过程,然后使用postman请求时,获取上传的form-data中文件的水,ctx.request.body却一直是undefined?
628 0