В настоящее время я разрабатываю простое приложение для браузера с использованием 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-документом, может ли это повлиять на процесс?
Подскажите, пожалуйста, как вы публикуете данные?
Возможно это решит вашу проблему: stackoverflow.com/questions/9177049/…
@YaminiChhabra Я пытаюсь опубликовать результат формы, состоящей из различных вариантов выбора и кнопки отправки, которая запускает публикацию. Однако это делается в асинхронной функции. Могло ли это привести к тому, что бодипарсер пропустил результат?
@dropTableUsers Нет, это не должно быть причиной, опубликуйте, пожалуйста, вашу асинхронную функцию.
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.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы настроили парсер тела для экспресс-использования? вы можете просто npm установить body-parser, а затем вставить его в свой код.
const bodyParser = require('body-parser')
app.use(bodyParser.json())
Надеюсь, это поможет!
Я попробовал, но это не сработало. Однако вызов функции для генерации html находится внутри асинхронной функции. Может это скинуть парсер тела?
Не могли бы вы дать мне более подробную информацию о том, как вы выполняете вызов api и вызов функции для генерации html? Вы установили заголовок в application / json? Я пробовал на почтальоне просто работает с вашим кодом.
Я сделал вызов API с помощью стандартных команд API Google Таблиц. Пример того, на чем основан мой код, - это developers.google.com/sheets/api/quickstart/nodejs. Я не устанавливал заголовок json или application.
При вызове 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())
как вы звоните / подробно? Я имею в виду, как вы "что-то публикуете"? Кроме того, насколько я понимаю, вы не используете bodyParser