POST-данные в NodeJS с использованием fetch ()

Я пытался изучить NodeJS, следуя это руководство по NodeJs на Youtube.

Я уже работал с Получить API пару месяцев, чтобы получить данные из бэкэндов WordPress и Google Sheets.

Последние видеоролики плейлистов Youtube посвящены созданию приложения To Do List с помощью NodeJS и npm express, EJS и body-parser.

Однако, в части 4 приложения "Список дел", этот «учитель» использует jQuery с Ajax для передачи данных POST на NodeJS (Его фрагмент кода jQuery). Поскольку я работал с fetch () только для запросов AJAX POST, я хотел продолжить использование этого метода на простом JavaScript.

Мой файл ejs с именем todo.ejs, в котором хранится HTML-шаблон страницы, выглядит так:

<!DOCTYPE html>
<html lang = "en">

<head>
    <meta charset = "utf-8">
    <meta name = "viewport" content = "width=device-width, initial-scale=1.0">

    <link rel = "stylesheet" href = "/assets/style.css">
    <!-- Works because of express middleware.
    Since we stored the public folder as a static folder,
    we can request anything within that folder from the url, such as
    127.0.0.1:3000/assets/styles.css
    -->

    <title>Todo List</title>
</head>

<body>
   <h1>My Todo List</h1>
    <div id = "todo-table">
        <form>
            <input type = "text" name = "item" placeholder = "Add new item..." required>
            <button type = "submit">Add Item</button>
        </form>
        <ul>
            <% todos.forEach(todoList =>{ %>
             <li> <%= todoList.item %> </li>   
           <% }) %>
        </ul>
    </div>
</body>
<script src = "/assets/script.js"></script>

</html>

Мой script.js (связанный со страницей todo.ejs) выглядит так:

document.addEventListener("DOMContentLoaded", function (event) {
    let submitButton = document.querySelector("button");
    let textField = document.querySelector("input");

    submitButton.addEventListener("click", addItem);

    function addItem() {

        let newItem = textField.value;
        let todo = {
            item: newItem
        };

        fetch("/todo", {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify(todo)
            }).then((res) => res.json())
            .then((data) => console.info(data))
            .catch((err) => console.info(err))
    }

});

И мой контроллер, обрабатывающий все запросы на получение / публикацию, называется todoController.js, выглядит так:

let bodyParser = require("body-parser");
let urlencodedParser = bodyParser.urlencoded({ extended: false });

// Have some items already in place
let data = [{item: "Get milk"} , {item: "Walk dog"} , {item: "Clean kitchen"}];

module.exports = function (app) {

    //Handle get data requests
    app.get("/todo", function (req, res) {
        res.render("todo", {todos: data});
    });

    //Handle post data requests (add data)
    app.post("/todo", urlencodedParser, function (req, res) {
        console.info(req.body);
    });

    //Handle delete data requests
    app.delete("/todo", function (req, res) {

    });
};

Теперь, каждый раз, когда я заполняю поле ввода некоторым текстом и нажимаю кнопку ввода, мой терминал выводит пустые объекты:

POST-данные в NodeJS с использованием fetch ()

Основываясь на этих пустых объектах, должно быть что-то не так, что мои запросы POST не принимаются / отправляются правильно.

Мое файловое дерево выглядит так: POST-данные в NodeJS с использованием fetch ()

Кто-нибудь, у кого есть (вероятно, очевидный) ответ на этот вопрос? (Я знаю, что могу просто взять его фрагмент кода jQuery Ajax, чтобы заставить его работать, но я с нетерпением пытаюсь понять его, используя простой Javascript)

Заранее спасибо всем, кто нашел время мне помочь :)

Поведение ключевого слова "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) для оценки ваших знаний,...
6
0
8 933
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вам нужно использовать bodyParser.json вместо bodyParser.urlencoded.

Как следует из названий, urlencoded будет анализировать параметры URL, а bodyParser.json будет анализировать json в теле запроса.

Вы, мой друг, только что заработали виртуальное пиво! Спасибо!

Tanckom 14.06.2018 16:51

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