/ / Як дозволити дані форми у NodeJS - node.js, api, листоноша

Як дозволити форму-дані в NodeJS - node.js, api, поштовий майстер

Нещодавно я створив API, який приймає файли. Я намагаюся протестувати API за допомогою Postman. Якщо я роблю запит на публікацію за допомогою x-wwww-form-urlencoded тип тіла, все працює, і я отримую всі очікувані дані. Єдина проблема полягає в тому, що він не дозволяє надсилати файл. Якщо я використовую form-data тип корпусу, що дозволяє надсилати файли, я не знаюотримувати що-небудь на задній панелі. Не впевнений, чи щось не так з Поштовиком, чи я роблю щось не так. Я гадаю, що бек-енд не приймає 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);
}