Node.js и экспресс: req.body undefined

В настоящее время я разрабатываю простое приложение для браузера с использованием Express. Я пытаюсь извлечь значение, которое пользователь выбирает в раскрывающемся меню. Я также присвоил каждой опции индивидуальное значение и объявил метод формы как / post. но когда я пробую, какое значение они выбрали, зайдя в req.body, значение не определено.

Я понимаю, что проблема может заключаться в том, что синтаксический анализатор тела просматривает похожие вопросы (Пример, Пример1), но решения этих вопросов не препятствуют тому, чтобы req.body был неопределенным.

Вот мой код для создания приложения

const app = express()
app.use(express.static(__dirname, ''));
app.engine('html', require('ejs').renderFile);
app.set('views', __dirname + '/public/views');
app.use(express.urlencoded());
app.set('view engine', 'html');
const server = http.createServer(app);

А вот код для обработки постов

app.get('/detailed', function(req,res){
    res.send(displayDetailed(results, req));
});
app.post('/detailed', function(req,res){
    res.send('Hello world');
    console.info(req.body);

});

Когда я публикую что-то в localhost: 8080 / detail, мир hello возвращается нормально, но req.body пуст (возвращается как {}). Функция displayDetailed - это настраиваемая функция, которая возвращает строку html со значениями, извлеченными из запроса на получение из API таблиц Google. Поскольку я не работаю с сохраненным html-документом, может ли это повлиять на процесс?

как вы звоните / подробно? Я имею в виду, как вы "что-то публикуете"? Кроме того, насколько я понимаю, вы не используете bodyParser

Lyubomir 28.05.2018 17:42

Подскажите, пожалуйста, как вы публикуете данные?

Yamini Chhabra 28.05.2018 17:45

Возможно это решит вашу проблему: stackoverflow.com/questions/9177049/…

Dvoliq 28.05.2018 17:47

@YaminiChhabra Я пытаюсь опубликовать результат формы, состоящей из различных вариантов выбора и кнопки отправки, которая запускает публикацию. Однако это делается в асинхронной функции. Могло ли это привести к тому, что бодипарсер пропустил результат?

dropTableUsers 29.05.2018 01:16

@dropTableUsers Нет, это не должно быть причиной, опубликуйте, пожалуйста, вашу асинхронную функцию.

Yamini Chhabra 29.05.2018 06:38
fs.readFile('client_secret.json', (err, content) => { if (err) return console.info('Error loading client secret file:', err); JSON.parse(content), extractAll); }); Где authorize - это функция, вызывающая авторизацию сеанса для Google Sheets API. extractAll просто делает запрос на получение через API листов, манипулирует данными и вызывает другую функцию для возврата строки html.
dropTableUsers 29.05.2018 17:51
Поведение ключевого слова "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) для оценки ваших знаний,...
3
6
8 318
4

Ответы 4

Вы настроили парсер тела для экспресс-использования? вы можете просто npm установить body-parser, а затем вставить его в свой код.

const bodyParser = require('body-parser')
app.use(bodyParser.json())

Надеюсь, это поможет!

Я попробовал, но это не сработало. Однако вызов функции для генерации html находится внутри асинхронной функции. Может это скинуть парсер тела?

dropTableUsers 29.05.2018 01:17

Не могли бы вы дать мне более подробную информацию о том, как вы выполняете вызов api и вызов функции для генерации html? Вы установили заголовок в application / json? Я пробовал на почтальоне просто работает с вашим кодом.

Elvis Wong 29.05.2018 03:59

Я сделал вызов API с помощью стандартных команд API Google Таблиц. Пример того, на чем основан мой код, - это developers.google.com/sheets/api/quickstart/nodejs. Я не устанавливал заголовок json или application.

dropTableUsers 29.05.2018 17:53

При вызове req.body вне асинхронной функции (где была вызвана функция, создающая html), req.body возвращался отлично. Я буду модифицировать свой проект, чтобы учесть это. Я должен был указать это в исходном вопросе, но, когда я писал вопрос, это не казалось актуальным. Спасибо всем кто ответил

Это решит вашу проблему:

App.use(bodyParser.urlencoded({extended: true}));

В большинстве случаев req.body не определен из-за отсутствия парсера JSON.

const express = require('express');
app.use(express.json());

может отсутствовать для парсера тела

const bodyParser  = require('body-parser');
app.use(bodyParser.urlencoded({extended: true}));

а иногда это не определено из-за перекрестного происхождения, поэтому добавьте их

const cors = require('cors');
app.use(cors())

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