邮递员原始数据有效但表单数据不适用于节点中的POST请求

时间:2018-02-10 22:57:51

标签: json node.js mongodb express postman

使用邮递员时我遇到了一些问题。当我尝试以JSON(application / json)格式发送原始数据时,它会获得成功。

Postman sending post request and succeded

但是当我尝试发送表单数据时,它会返回一些错误。

{
    "error": {
        "errors": {
            "name": {
                "message": "Path `name` is required.",
                "name": "ValidatorError",
                "properties": {
                    "message": "Path `{PATH}` is required.",
                    "type": "required",
                    "path": "name"
                },
                "kind": "required",
                "path": "name",
                "$isValidatorError": true
            },
            "price": {
                "message": "Path `price` is required.",
                "name": "ValidatorError",
                "properties": {
                    "message": "Path `{PATH}` is required.",
                    "type": "required",
                    "path": "price"
                },
                "kind": "required",
                "path": "price",
                "$isValidatorError": true
            }
        },
        "_message": "Product validation failed",
        "message": "Product validation failed: name: Path `name` is required., price: Path `price` is required.",
        "name": "ValidationError"
    }
}

Postman errors

这是我的项目代码片段

product.js

import express from 'express';
import mongoose from 'mongoose';
import Product from '../models/product.model';

router.post('/', (req, res, next) => {
    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: 'Created product successfully',
            createdProduct: {
                name: result.name,
                price: result.price,
                _id: result._id,
                request: {
                    type: 'GET',
                    url: `http://localhost:3000/products/${result._id}`
                }
            }
        });
    }).catch(err => {
        console.log(err);
        res.status(500).json({
            error: err
        });
    });
});

product.model.js

import mongoose from 'mongoose';

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

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

5 个答案:

答案 0 :(得分:1)

除了使用body-parser之外,它还将返回空的req.body,这将导致错误,因为您已经进行了验证。当使用form-data tru Postman发送POST请求时,它返回空的req.body的原因是因为body分析器无法处理multipart / form-data。您需要一个可以处理多部分/表单数据(例如multer)的软件包。参见https://www.npmjs.com/package/multer。尝试使用该软件包。

答案 1 :(得分:0)

您需要使用body-parser。

npm install body-parser --save

然后只需添加您的代码

var bodyParser = require('body-parser')

app.use(bodyParser.json())

可以找到详细信息https://www.npmjs.com/package/body-parser

答案 2 :(得分:0)

你失踪了

app.use(bodyParser.urlencoded({ extended: true }));

然后尝试x-www-form-urlencoded

答案 3 :(得分:0)

  • 使用multer获取表单数据

  • 内部上传功能,您可以从表单数据中获取请求正文

https://www.npmjs.com/package/multer

答案 4 :(得分:0)

  • 使用 postman's formdata 发送的任何数据都被视为 multipart/formdata。您必须使用 multer 或其他类似的库来解析表单数据。
  • 对于 x-www-form-urlencodedraw 来自 postman 的数据不需要 multer 进行解析。您可以使用 body-parser 或表达内置中间件 express.json()express.urlencoded({ extended: false, })
  • 解析这些数据
  • 由于 multer 返回一个中间件,因此您只能访问 multer 内部的 req.body (即 fileFilter)或在 multer 之后的中间件中访问,但如果您没有将 multer 用作全局中间件(这是个坏主意) .

对于代码片段:https://stackoverflow.com/a/68588435/10146901