Express не видит значения формы

212
31 января 2022, 06:40

При отправке формдаты req.body express'а пустой. index.js

const express = require("express");
const bodyParser = require("body-parser");
const cookieParser = require("cookie-parser");
const credentials = require("./credentials.js");
const app = express();
const handlebars = require('express-handlebars').create({defaultLayout:"main"})
app.engine('handlebars',handlebars.engine);
app.set("view engine","handlebars");
app.set("view cache","handlebars");
app.set("port",process.env.PORT || 3000);
app.use(express.static(__dirname + "/public"));
app.use(bodyParser.urlencoded({extended:true}));
app.use(cookieParser(credentials.cookieSecret))
app.get("/",function(req,res){
    let data = req.cookies.value ? req.cookies.value : 0;
    res.render("form",{value:data});
})
app.get("/send",function(req,res){
    res.type("text/plain");
    res.status(200);
    res.send("rpf;");
})
app.get("/about",function(req,res){
    res.render("about");
})
app.post("/register",function(req,res){
    console.log(req.body);
    res.send("Works!");
})
app.use(function(req,res){
    res.status(404);
    res.render("404");
})
app.use(function(err,req,res,next){
    res.status(500);
    res.send("500 - Ошибка Сервера");
})
app.listen(app.get('port'),function(){
    console.log("The server is working")
})

main.js

const form = document.querySelector(".main-form");
form.onsubmit = async (e) => {
    e.preventDefault();
    const data = new FormData(form);
    fetch(`${form.action}`,{
        "X-Requested-With":"XMLHttpRequest",
        "method":"POST",
        body:data
    }).then(response => response.text()).then(val => console.log(val));
}

form.handlebars

<form class="main-form" action="/register" method="POST">
    <fieldset>
        <legend>Please write down your information.</legend>
        <input type="text" name="Value"/>
    </fieldset>
    <button type="submit">Send form!</button>
</form>
Answer 1

Это происходит из-за того, что вы отправляете данные как Form Data (multipart/formdata), но body-parser не умеет работать с таким типом, на GitHub пишут:

This does not handle multipart bodies, due to their complex and typically large nature. For multipart bodies, you may be interested in the following modules:

Исправить это можно убрав использование Form Data из main.js, т.е. оправлять запрос обычными средствами браузера, тогда он будет отправляться как application/x-www-form-urlencoded, и body-parser его прекрасно поймет (multipart/formdata вам тут не нужен, он в основном используется при передаче файлов).

Или если же нужно отправлять как Form Data, то можно поставить один из пакетов перечисленных на GitHub, например multer:

const multer = require('multer');
const upload = multer();
app.post("/register", upload().none(), function (req, res) {
    console.log(req.body);
    res.send("Works!");
})
READ ALSO
Переход между элементами с пропуском если есть class (hide)

Переход между элементами с пропуском если есть class (hide)

Здравствуйте помогите пожалуйстаКак сделать так что бы если в элементе li существует class hide тогда этот элемент пропустить и перейти к другому

78
помогите понять, как исправить ошибку Error in v-on handler: &quot;TypeError: commentsListWidth is not a function&quot;

помогите понять, как исправить ошибку Error in v-on handler: "TypeError: commentsListWidth is not a function"

мне просто нужно установить ширину списка, но появляется ошибка Error in v-on handler: "TypeError: commentsListWidth is not a function" как ее исправить?

100
Какая разница между &lt;тег&gt;...&lt;/тег&gt; и &lt;тег/&gt;

Какая разница между <тег>...</тег> и <тег/>

Есть ли разница в написании кода

109
Запросы PUT/PATCH/DELETE

Запросы PUT/PATCH/DELETE

Изучаю первый день DjangoСоздал html файл, связал его с представлениями через URL как показано тут: https://metanit

196