/ / Как да се разрешат формулярните данни в NodeJS - node.js, api, пощальон

Как да позволите формуляра данни в NodeJS - node.js, api, пощальон

Наскоро създадох API, който приема файлове. Опитвам се да тествам API с помощта на Postman. Ако направя заявка за публикуване, използвайки x-wwww-form-urlencoded тип тяло, всичко работи и получавам всички очаквани данни. Единственият проблем е, че не позволява да се изпрати файл. Ако използвам form-data тип тяло, което ви позволява да изпращате файлове, аз не "tполучавате нещо в задния край. Не съм сигурен дали нещо не е наред с Пощальон или ако правя нещо нередно. Предполагам, че бек-ендът не приема form-data в момента, затова не получавам никакви данни. Нещо, което бих могъл да направя, за да променя това?

Заглавките ми изглеждат подобно досега,

res.setHeader("Access-Control-Allow-Origin", origin);
res.header("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, DELETE, OPTIONS");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, form-data");

app.js

app
// static route will go to the client (angular app)
.use(express.static("client"))

// secured routes
.use("/api", secured_route)

// add a user route
.post("/user", user_api_controller.add_user)

// delete this in the production
.use(function(req, res, next) {
res = allowed_orgins(req, res);
next();
})
;

allowed_orgins = function (req, res){
var allowedOrigins = ["http://localhost:4200", "http://localhost:8100"];
var origin = req.headers.origin;
if(allowedOrigins.indexOf(origin) > -1){
res.setHeader("Access-Control-Allow-Origin", origin);
res.header("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, DELETE, OPTIONS");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, multipart/form-data");
}
return res;
}

user_api_controller.js

module.exports.add_user = function (req, res) {
console.log(req.body.username);
console.log(req.body.other_parameters);
}

Не получавам нищо отпечатване на конзолата, ако използвам form-data, но работи добре, когато го използвам x-wwww-form-urlencoded.


Аз използвах multer middle ware, Все още не получавам нищо. Средният посуда влиза в игра, когато моят бек-енд ще получи нещо. Опитах се да получа обикновените текстови полета на form-dataи аз също не получавам това. Това означава, че моят бек-енд не може да получи всички form-data полета, не само файлове, но и текстови полета.

Отговори:

0 за отговор № 1

Ето моя супер прост експресен пример:

const express = require("express")
const fileUpload = require("express-fileupload");

const app = express()
app.use(fileUpload());

app.post("/file-upload", function(req, res, next) {
console.log(req.body.msg);
console.log(req.files);
res.send("ok");
next();
});

app.listen(3000, function () {
console.log("Example app listening on port 3000!")
})

Съжалявам, че не използвам пощальон, но го използвам curl и работи за мен:

curl http://localhost:3000/file-upload 
-H "Content-Type: multipart/form-data" 
-F "file=@/YourDir/YourFile.txt" 
-F "msg=MyFile"

Така че можете да опитате, да го тествате, да получите същността и да играете с приложението си, като използвате тази команда curl.


0 за отговор № 2

Всъщност заглавката на Content-Type за качване на файлове multipart/form-data не form-data, За да качите файл по подходящ начин в Пощальон, моля, погледнете тук: https://github.com/postmanlabs/postman-app-support/issues/1441#issuecomment-289452571

В задния ден ще ви е необходима библиотека, която да обработва multipart/form-data поискване. Ако използвате expressjs, тази библиотека ще отговаря на вашите нужди https://www.npmjs.com/package/multer

Ето как да използвате multer библиотека

1) Първо инсталирайте мултер

npm install --save multer

2) Включете библиотеката във вашия код (обърнете внимание, че директорията за качване трябва да съществува)

var multer  = require("multer")
var upload = multer({ dest: "uploads/" })

3) Използвайте upload като междинен софтуер за вашия add_user крайна точка (попълнете скобите с името на вашето поле, които съдържат качен файл)

app
// other endpoints
.post("/user", upload.single(/* file field name in your form */), user_api_controller.add_user)

4) Файлът може да бъде достъпен във вашия user_api_controller.js

module.exports.add_user = function (req, res) {
console.log(req.file);
}