Как правильно выполнить POST-запрос?

Работа на простом 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 Как правильно выполнить POST-запрос?

Может кто-нибудь, пожалуйста, дайте мне подсказку, может быть, что я делаю неправильно? Мне также нужно объявление класса? Спасибо!

Вы отображаете объект, а не что-то внутри этого объекта, если это имеет смысл? Попробуйте сделать что-то вроде POSTed new vehicle: ${vehicle.type} - ${vehicle.brand}

Aidan Donnelly 21.03.2022 11:39

Почему вы отправляете тело сообщения сырой с таким содержанием? У вас действительно есть парсер на стороне сервера, который понимает формат тот? Вероятно, вам следует отправить это как x-www-form-urlencoded.

CBroe 21.03.2022 11:40
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
46
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Посмотрите на документация по 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. Дополнительные подробности опубликую в ответ на эту тему.

DBT92 21.03.2022 16:15

По совету @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 Upon completing the

GET ниже, просто чтобы проверить, действительно ли объект был добавлен:

Также полезно в моем стремлении: https://www.npmjs.com/package/body-parser

Не используйте body-parser. Как говорит документация для req.body, промежуточное ПО для парсинга тела теперь встроено в Express.

Quentin 21.03.2022 16:30

@Quentin Проверено еще раз, я почему-то пропустил это. Удален парсер тела, используется только экспресс. Спасибо!

DBT92 21.03.2022 21:56

Другие вопросы по теме