Node.js, экспресс, как получить данные из данных формы тела в почтовом запросе

У меня есть простое приложение 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, все в порядке. Когда я проверяю это с почтальоном, Node.js, экспресс, как получить данные из данных формы тела в почтовом запросе

в консоли он возвращает

Web App Hosted at http://localhost:3000
{}
undefined

У меня новейший экспресс.

И я пробовал другие вещи, такие как добавить body-parser, добавить заголовок к content-type, добавить express.urlencoded(), но ничего не работает. мне нужно получить данные от form-data как у почтальона на картинке выше. Как я могу получить это?

Возможный дубликат Что делает body-parser с экспрессом?

zero298 25.06.2019 18:21

@zero298 думаю, что нет, потому что я использую новейший экспресс. Так что мне не нужен парсер тела

alfianrehanusa 26.06.2019 04:15
Поведение ключевого слова "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) для оценки ваших знаний,...
16
2
30 861
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

вам нужно установить анализатор тела для разбора 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() тут бесполезен.

poohitan 25.06.2019 18:41

@Shubh да, и у меня есть новейший экспресс.

alfianrehanusa 26.06.2019 03:34

Express указывает в своем Документация по API, что вы должны использовать одно из предоставленных промежуточных программ, чтобы присвоить телу значение. Они приняли это решение, потому что существует множество различных форматов, которые могут принимать тела HTTP-запросов, и они не хотят предполагать, какой из них использует ваше приложение.

Вы добавили Content-Type: application/json в заголовки? У меня была такая же проблема, и я решил ее, добавив Content-Type: application/json.

да, но все еще не определено

alfianrehanusa 26.06.2019 03:36

Это не решило с экспрессом v4.17.1

Veeresh Devireddy 30.12.2021 06:39
Ответ принят как подходящий

спустя несколько часов я нашел его.

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 в свои маршруты :)

Alisher Musurmonv 20.12.2019 06:17

I had face same problem.I had solved following way:

  1. First install 'express-fileupload' package.

  2. include express-fileupload

    fileUpload = require('express-fileupload')

  3. 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.

    

Не могли бы вы объяснить, как это решает вопрос пользователя?

Yves Gurcan 23.03.2021 19:22

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