Node.js &引用;无法读取属性';名称';“未定义”的定义;失眠的POST-JSON方法

Node.js &引用;无法读取属性';名称';“未定义”的定义;失眠的POST-JSON方法,node.js,json,post,insomnia,Node.js,Json,Post,Insomnia,我用它来测试我的项目API(比如一个邮递员)程序,当我使用GET方法时,所有方法都不会出现问题,但是POST方法返回未定义的req.body.name和req.body.price, 这是我抓住的,这是我的要求 这是我的app.js const express = require('express'); const app = express(); const morgan = require('morgan'); const mongoose = require('mongoose'); r

我用它来测试我的项目API(比如一个邮递员)程序,当我使用GET方法时,所有方法都不会出现问题,但是POST方法返回未定义的
req.body.name
req.body.price
, 这是我抓住的,这是我的要求

这是我的app.js

const express = require('express');
const app = express();
const morgan = require('morgan');
const mongoose = require('mongoose');
require('dotenv').config()


mongoose.connect(`mongodb+srv://vadim:${process.env.MONGO_ATLAS_PS}@cluster0-abuqs.mongodb.net/shop`, {
  useNewUrlParser: true,
  useUnifiedTopology: true
});

const productRoutes = require('./api/routes/

app.use(morgan('dev'));

app.use('/products', productRoutes);

module.exports = app;
这是我的产品路由器.js

const express = require('express');
const router = express.Router();
const mongoose = require('mongoose');
const Product = require('../models/product')

router.post("/", (req, res, next) => {
    console.log(JSON.stringify(req.body))
    const product = new Product({
        _id: new mongoose.Types.ObjectId(),
        name: req.body.name,
        price: req.body.price
    });
    product
        .save()
        .then(result => {
            console.log(result);
            res.status(201).json({
                message: "Handling POST requests to /products",
                createdProduct: result
            });
        })
        .catch(err => {
            console.log(err);
            res.status(500).json({
                error: err
            });
        });
});
product.js的定义和模型

const mongoose = require('mongoose');

const productSchema = mongoose.Schema({
    _id: mongoose.Schema.Types.ObjectId,
    name: String,
    price: Number
});

module.exports = mongoose.model('Product', productSchema);

您需要使用主体解析器使用express的POST方法捕获数据

首先,您需要安装它:

npm install body-parser --save
然后在代码中:

const express = require('express');
const router = express.Router();
const mongoose = require('mongoose');
const Product = require('../models/product');
const bodyParser = require('body-parser');

express.use(bodyParser.json());

express.post("/", (req, res, next) => {
    console.log(JSON.stringify(req.body))
    const product = new Product({
        _id: new mongoose.Types.ObjectId(),
        name: req.body.name,
        price: req.body.price
    });
    //The rest of your code
});

有关它的更多信息,请参见。

您确定api收到了实际的POST请求吗?您可以通过查看morgan日志来确定这一点。另外,我可以推荐使用
主体解析器
插件,这使得使用JSON主体更加容易,痛苦更少。看看它:)是的,你是对的
express.use(bodyParser.json())
帮助了我,但我认为
主体解析器
现在替换为
useNewUrlParser:true
我错了?这是express的mongodb问题。您需要在mongo配置中添加useNewUrlParser。检查此线程中的答案:检查plz my app.js我在我的
mongoose.connect中使用的
useNewUrlParser
,但它不起作用,我认为mongo会过早地将数据添加到数据库中。您需要在连接后添加
.then()
,然后调用路由以确保连接成功,然后再继续。