【问题标题】:UnhandledPromiseRejectionWarning: TypeError: Cannot destructure property 'name' of 'req.body' as it is undefinedUnhandledPromiseRejectionWarning:TypeError:无法解构“req.body”的属性“name”,因为它未定义
【发布时间】:2021-03-31 04:50:16
【问题描述】:

我目前正在尝试学习 MERN Stack 网络开发。我遇到了一个不寻常的问题。 所以我正在尝试使用 Postmate 尝试将数据从正文输入到数据库。从 server.js 文件执行此操作时,它会起作用,但是当我尝试从其他文件执行此操作时,控制台将无法识别输入的数据

这是我的控制器文件(当我控制台记录 req.body 时它只是返回未定义)

import express from 'express';
import mongoose from 'mongoose';

import StudentsData from '../models/students.js';
 
const router = express.Router();

export const createStudent = async (req, res) => {
    const { name } = req.body;
    console.log(req.body);
    const newStudentsData = new StudentsData({ name });

    try {
        await newStudentsData.save();

        res.status(201).json( newStudentsData );
    } catch (error) {
        res.status(409).json({ message: error.message });
    }
}

这是我的路线文件

import express from 'express';

import { createStudent, getStudents, deleteStudent, updateStudent } from '../controllers/students.js';

const router = express.Router();

router.post('/insertdata', createStudent);

export default router;

这是我的模型文件

import mongoose from 'mongoose';

const studentsSchema = mongoose.Schema({
    name: String,
    email: String,
    roll_no: Number,
    gender: String
});

const studentsData = mongoose.model('studentsData', studentsSchema);

export default studentsData;

这是我的 server.js 文件

import mongoose from 'mongoose';
import express from 'express';
import bodyParser from 'body-parser';

import router from './routes/students.js';

const app = express();

app.use('/students', router);

app.use(express.json());
app.use(bodyParser.json({ limit: "30mb", extended: true}));
app.use(bodyParser.urlencoded({ limit: "30mb", extended: true}));


mongoose.connect("mongodb+srv://merntutor:merntutor123@cluster0.txjnr.mongodb.net/myFirstDatabase?retryWrites=true&w=majority", {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
})
.then(() => {
    console.log("DB CONNECTED");
});
const PORT = 8000;

app.listen(PORT, () => {
    console.log(`app is running at ${PORT}`);
});

在正文上,我输入了

{
    "name": "test"
}

【问题讨论】:

  • 似乎名称在new StudentsData({ name }); 处有双括号? name 已经是 req.body.name = {"name": "test"} 的对象,但它有像 { {"name": "test"}} 这样的对象括号
  • 哦,是的。我的不好,我刚刚更正了,错误仍然出现
  • 因为 app.use(bodyParser...) 没有在控制器文件中使用(应该解析哪个 json 对象)所以req.body 不是未定义的?

标签: javascript mongodb express mern body-parser


【解决方案1】:

请在server.js 文件中在app.use('/students', router); 之前写上app.use(express.json());express.json() 中间件应该在所有路由之前运行。

另外,你认为你需要bodyParser,因为.json().urlencoded() 现在已经可以使用 express 了吗?

【讨论】:

  • 啊。我尝试了您的第一个建议,现在可以了。我不太明白你在第二个陈述中的意思。你能详细说明一下吗?还是说程序现在可以工作了?
  • 哦,你能解释一下它是如何工作的吗,不久前我尝试按照 youtube 上的教程制作一个类似的程序,并且代码可以在不使用 app.use(express.json()); 语法的情况下工作
  • 使用 Express 4.x,您不需要将 bodyParser 作为单独的中间件。 Express 为您提供express.json()express.urlencoded()
【解决方案2】:

为什么 console.log(req.body) 如果您已经 分配 const {name} 中的值,您不应该console.log(名称) 我认为希望它对你有用

【讨论】:

  • 我之前尝试过,它还在终端上输出 undefined 。问题是程序无法从控制器文件中的 req body 中获取数据,而可以从 server.js 中获取数据
  • 尝试在你的控制器文件中添加正文解析器中间件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
  • 2020-10-07
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
  • 2021-05-11
  • 1970-01-01
相关资源
最近更新 更多