Работа на простом 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
Может кто-нибудь, пожалуйста, дайте мне подсказку, может быть, что я делаю неправильно? Мне также нужно объявление класса? Спасибо!
Почему вы отправляете тело сообщения сырой с таким содержанием? У вас действительно есть парсер на стороне сервера, который понимает формат тот? Вероятно, вам следует отправить это как x-www-form-urlencoded
.
Посмотрите на документация по API для 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) => {
У вас там нет параметров. Так что это не может быть правильным.
Теперь посмотрите на скриншот своего Почтальона, на котором вы вводите данные на вкладке с надписью Тело.
Вернитесь к документу 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().
Итак, настройте промежуточное ПО для разбора тела, затем измените данные, которые вы отправляете POST, чтобы они были на самом деле в этом формате (ваш скриншот показывает, что вы вводите необработанные данные, которые почти, но не совсем JSON, поэтому вам нужно это исправить) , убедитесь, что вы зашли в раздел «Заголовки» и установили заголовок Content-Type
для описания формата, который вы отправляете, а затем посмотрите на req.body
вместо req.params
.
спасибо за вклад. Я установил парсер тела и включил его в свой код. Затем я изменил функцию сообщения: - router.post('/:id', (req, res, next), old router.post('/', (req, res, next) - изменил req.param* на req.body* в теле функции поста. В качестве последнего шага я изменил тип тела в Postman на x-www-form-urlencoded. Дополнительные подробности опубликую в ответ на эту тему.
По совету @Quentin: Я установил парсер тела и включил его в свой код.
import bodyParser from "body-parser";
router.use(express.json());
router.use(bodyParser.urlencoded({ extended: true }));
Затем я изменил 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.
ПОСТ ниже, localhost:3000/vehicles/:id
GET ниже, просто чтобы проверить, действительно ли объект был добавлен:
Также полезно в моем стремлении: https://www.npmjs.com/package/body-parser
Не используйте body-parser
. Как говорит документация для req.body, промежуточное ПО для парсинга тела теперь встроено в Express.
@Quentin Проверено еще раз, я почему-то пропустил это. Удален парсер тела, используется только экспресс. Спасибо!
Вы отображаете объект, а не что-то внутри этого объекта, если это имеет смысл? Попробуйте сделать что-то вроде
POSTed new vehicle: ${vehicle.type} - ${vehicle.brand}