У меня есть простое приложение node.js. Я хочу получить тело сообщения от пользователя.
app.js
var express = require('express');
var app = express();
app.use(express.json());
app.post('/api/user', function (req, res) {
console.info(req.body);
console.info(req.body.username);
});
module.exports = app;
сервер.js
var app = require('./app.js');
var server = app.listen(3000, function () {
var port = server.address().port;
console.info('Web App Hosted at http://localhost:%s',port);
});
Когда я запускаю его с помощью node server.js, все в порядке. Когда я проверяю это с почтальоном,

в консоли он возвращает
Web App Hosted at http://localhost:3000
{}
undefined
У меня новейший экспресс.
И я пробовал другие вещи, такие как добавить body-parser, добавить заголовок к content-type, добавить express.urlencoded(), но ничего не работает. мне нужно получить данные от form-data как у почтальона на картинке выше. Как я могу получить это?
@zero298 думаю, что нет, потому что я использую новейший экспресс. Так что мне не нужен парсер тела



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


вам нужно установить анализатор тела для разбора req.body
var bodyParser = require("body-parser");
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
body-parser extract the entire body portion of an incoming request stream and exposes it on req.body.
В вопросе есть скриншот, где видно, что @alfian5229 отправляет запрос данных формы, а не json. Так что express.json() тут бесполезен.
@Shubh да, и у меня есть новейший экспресс.
Express указывает в своем Документация по API, что вы должны использовать одно из предоставленных промежуточных программ, чтобы присвоить телу значение. Они приняли это решение, потому что существует множество различных форматов, которые могут принимать тела HTTP-запросов, и они не хотят предполагать, какой из них использует ваше приложение.
Вы добавили Content-Type: application/json в заголовки? У меня была такая же проблема, и я решил ее, добавив Content-Type: application/json.
да, но все еще не определено
Это не решило с экспрессом v4.17.1
спустя несколько часов я нашел его.
body-parser не требуется, потому что в новейший экспресс включен.
я нашел, как получить данные формы, для этого требуется промежуточное программное обеспечение multer (для анализа составных данных/данных формы). я нашел это в здесь.
первая установка мультера
npm install multer --save
импортировать multer в ваше приложение. например в моем коде
var express = require('express');
var app = express();
var multer = require('multer');
var upload = multer();
// for parsing application/json
app.use(express.json());
// for parsing application/x-www-form-urlencoded
app.use(express.urlencoded({ extended: true }));
// for parsing multipart/form-data
app.use(upload.array());
app.use(express.static('public'));
app.post('/api/user', function (req, res) {
console.info(req.body);
console.info(req.body.username);
});
module.exports = app;
поэтому он может получать данные формы, необработанные или x-www-form-urlencoded.
У меня тоже была такая же проблема, и я потратил 3 часа, пытаясь понять, что пошло не так. Наконец, я также забыл включить свою функцию multer в свои маршруты :)
I had face same problem.I had solved following way:
First install 'express-fileupload' package.
include express-fileupload
fileUpload = require('express-fileupload')enable files upload
app.use(fileUpload({ createParentPath: true }));N.B: Or You can use multer package instead of express-fileupload package.as your wish.
const express = require("express");
var multer = require('multer');
var upload = multer();
const app = express();
var multiparty = require('multiparty');
var util = require('util');
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(upload.array());
app.use(express.static('public'));
// default options
const addFileDetail = (req, res,next) => {
//app.post('/upload', function(req, res) {
var sampleFile = req.body.filepath;
console.info(req.body.filepath);
// var uploads = "./"+req.body.filepath+"/"+req.body.org+"/"+req.body.type+'/';
// await createDir(uploads);
// let uploadPath = uploads;
// if (!req.files || Object.keys(req.files).length === 0) {
// return res.status(400).send('No files were uploaded.');
// }
// // The name of the input field (i.e. "sampleFile") is used to retrieve the uploaded file
// sampleFile = req.files.sampleFile;
// uploadPath = __dirname + uploadPath + sampleFile.name;
// // Use the mv() method to place the file somewhere on your server
// sampleFile.mv(uploadPath, function(err) {
// if (err)
// return res.status(500).send(err);
var form = new multiparty.Form();
form.parse(req, function(err, fields, files) {
res.writeHead(200, { 'content-type': 'text/plain' });
res.write('received upload:\n\n');
res.end(util.inspect({fields: fields, files: files}));
console.info('fields: %@', fields);
console.info('files: %@', files);
});
// res.send('File uploaded!');
// });
}
const createDir = (dirPath) => {
fs.mkdir(dirPath, { recursive: true }, (err) => {
if (err) {
throw err;
}
console.info("Directory is created.");
});
}
module.exports = {
// getfile: getfile,
addFileDetail: addFileDetail,
// viewFiles: viewFiles
};
i am getting issue in this.
Не могли бы вы объяснить, как это решает вопрос пользователя?
Возможный дубликат Что делает body-parser с экспрессом?