如何正确执行 POST 请求?

How do I perform a POST request properly?

正在处理一个简单的 API。设法使 GET 和 DELETE 请求正常工作,但 POST 请求存在一些问题。很确定这是一个菜鸟错误,但我错过了这里的逻辑。

这是定义所有路由的文件。

import express from 'express';    
import fs from 'fs';

const router = express.Router();

'use strict';
let rawdata = fs.readFileSync('api/resources/vehicles.json');
let vehicles = JSON.parse(rawdata);
let vehiclesArray = vehicles.vehicles;

let data = JSON.stringify(vehicles);
fs.writeFileSync('api/resources/vehicles.json', data);

router.get('/', (req, res, next) => {
    res.status(200).json(vehiclesArray);
});

router.get('/:id', (req, res, next) => {
    let id = req.params.id;
    res.status(200).send(vehiclesArray[(id-1)]);
});

router.delete('/:id', (req, res, next) => {
    let id = req.params.id;
    const removedVehicle = vehiclesArray.splice(id, 1);
    res.status(200).json({
        message: `Vechicle ${removedVehicle} with id ${id} was removed`
    });
});

router.post('/', (req, res, next) => {
    let id = vehiclesArray.length + 1;
    
    const vehicle = { 
        "id" : id, 
        "type" : req.params.type, 
        "brand" : req.params.brand, 
        "model" : req.params.model, 
        "production_year" : req.params.production_year, 
        "kilometers_driven" : req.params.kilometers_driven, 
        "price" : req.params.price
    };
    
    res.status(201).send({
    message: `POSTed new vehicle: ${vehicle}`,
    vehicle: vehicle
});
    res.status(201).send(vehiclesArray.push(vehicle));
    
});

export default router;

在我的 POST 方法中,我定义了车辆,但是一旦我尝试发送它,我在 Postman 中得到以下信息,即确认添加的对象和对象,但只有 id 属性

有人可以给我一些提示,也许我做错了什么吗?我还需要 class 声明吗?谢谢!

看看the API documentation for params:

This property is an object containing properties mapped to the named route “parameters”. For example, if you have the route /user/:name, then the “name” property is available as req.params.name. This object defaults to {}.

现在看看你的路线。

router.post('/', (req, res, next) => {

你那里没有任何参数。所以这不是正确的事情。


现在看看您的 Postman 屏幕截图,您正在标签为 Body.

的选项卡上填写数据

返回 API 文档并浏览属性列表。

req.body 列在那里并说:

Contains key-value pairs of data submitted in the request body. By default, it is undefined, and is populated when you use body-parsing middleware such as express.json() or express.urlencoded().


因此设置一个 body-parsing 中间件,然后更改您正在发布的数据,使其实际上采用该格式(您的屏幕截图显示您正在输入 almost-but-not-quite-JSON 的原始数据,因此您需要解决这个问题),确保你进入 Headers 部分并设置 Content-Type header 来描述你发送的格式,然后查看 req.body 而不是 req.params.

根据@Quentin 的建议: 我安装了 body-parser 并将其包含在我的代码中。

import bodyParser from "body-parser";
router.use(express.json());
router.use(bodyParser.urlencoded({ extended: true }));

然后我在 post 函数体中将 req.param* 更改为 req.body*。

router.post('/:id', (req, res, next) => {
    let id = vehiclesArray.length + 1;
    
    const vehicle = { 
        "id" : id, 
        "type" : req.body.type, 
        "brand" : req.body.brand, 
        "model" : req.body.model, 
        "production_year" : req.body.production_year, 
        "kilometers_driven" : req.body.kilometers_driven, 
        "price" : req.body.price
    };
    
    res.status(201).send({vehicle: vehicle});
    res.status(201).send(vehiclesArray.push(vehicle));  
    
});

作为最后一步,我将 Postman 中的正文类型更改为 x-www-form-urlencoded。 POST 下面,localhost:3000/vehicles/:id

下面的 GET,只是为了检查是否确实添加了对象:

对我的努力也有帮助: https://www.npmjs.com/package/body-parser