首页 > 解决方案 > req.body 是空的,为什么?

问题描述

我想将一些数据发送到我的 MongoDB 数据库,但是在 router.post 中,我的 req.body 是空的,如果我使用放入我的发送函数User(req.body)而不是req.body data将正确发送到我的 MongoDB 数据库的东西。

这是我使用的路由器,router.get工作正常,它在/api页面上正确返回数据库表:

const router = require("express").Router();
const User = require("./model/models");
const parser = require("body-parser").json();

router.get("/", async (req, res) => {
    const data = await User.find({});
    res.json(data);
});

router.post("/",parser,async (req, res) => {
    console.log('1')
    console.log(req.body)
    console.log('2')
    parser.v
    await User(req.body).save();
    res.json({"msg": "ok"});
});

module.exports = router

这是我的index.js文件代码:

const bodyParser = require('body-parser');
const express = require('express');
const app = express();
const parser = require("body-parser").json();
var path = require('path');

app.use(express.urlencoded(true));
app.use(express.json());
app.use(parser);
app.use('/',require("./routes/routes"))
app.use(express.static(__dirname +'/public'))
app.use("/api", require('./data/api'))

app.listen(5000,function(){
    console.log('server is alive')
})

这是我用来发送数据的功能:

const btn1 = document.getElementById('btnEnter')
let Login = "123"
btn1.addEventListener('click' ,e=>{
    send({newsTxT : "someTextHere",newsZag:"someZag",author:"SomeAuthor"})
})
const send = async(body) => {
    let res = await fetch("/api", {
        method: "post",
        header: {
            "Content-Type": "application/json",
            "Accept": "application/json"
        },
        body: JSON.stringify(body)
    });
    let data = await res.json();
    console.log(data)
}

标签: javascriptmongodbexpress

解决方案


我看到的唯一奇怪的事情是您正在使用 ajson body-parser并且express.json()两者在技术上都做同样的事情,但body-parser已被弃用,因此它可能会导致错误。

此外,您不必在路由中再次导入它,放置app.use(express.json())atindex.js将使其适用于所有端点/路由。

看看这个重构是如何进行的:

const router = require('express').Router()
const User = require('./model/models')

router.get('/', async (req, res) => {
  const data = await User.find({})
  res.json(data)
})

router.post('/', async (req, res) => {
  console.log('1')
  console.log(req.body)
  console.log('2')
  await User(req.body).save()
  res.json({ 'msg': 'ok' })
})

module.exports = router

index.js

const express = require('express')
const app = express()
var path = require('path')

app.use(express.urlencoded(true))
app.use(express.json())

app.use('/', require('./routes/routes'))
app.use(express.static(__dirname + '/public'))
app.use('/api', require('./data/api'))

app.listen(5000, function () {
  console.log('server is alive')
})

推荐阅读