繁体   English   中英

req.body 是空的,为什么?

[英]req.body is empty, why?

我想将一些数据发送到我的 mongodb 数据库,但是在 router.post 我的 req.body 是空的,如果我使用我在用户(req.body)instade 的 req.body 数据中放入我的发送函数的东西正确到我的 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)
}

我认为该方法区分大小写,请尝试更改post -> POST

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

此外,您不必在路由中再次导入它,将app.use(express.json())放在index.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

索引.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')
})

以下工作正常:

const express = require("express")
const app = express()
const router = express.Router()
router.use(express.json())

app.use(router)

router.post('/api/user', function(req, res) {
    // ...
}

我看到不同之处可能是使用: app.use(router)

注意上面代码中的语句:

router.use(express.json())

可以替换为(使用body-parser ):

const bodyParser = require('body-parser')
router.use(bodyParser.json())

这工作得很好用express版本4.17.1, body-parser版本1.19.0和NodeJS版本12.18.3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM