2017-10-20 35 views
1

J'ai récemment créé une API qui accepte les fichiers. J'essaie de tester l'API en utilisant Postman. Si je fais une demande de poste en utilisant le type de corps x-wwww-form-urlencoded, tout fonctionne et j'obtiens toutes les données attendues. Le seul problème est qu'il ne permet pas d'envoyer un fichier. Si j'utilise le type de corps form-data, cela vous permet d'envoyer des fichiers, je ne reçois rien à l'arrière-plan. Je ne sais pas si quelque chose ne va pas avec Postman ou si je fais quelque chose de mal. Mon intuition est que le back-end n'accepte pas form-data actuellement, c'est pourquoi je ne reçois aucune donnée. Tout ce que je pourrais faire pour changer ça?Comment autoriser les données de formulaire dans NodeJS

Mes têtes ressemblent à ceci jusqu'à présent,

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); 
} 

Je ne reçois rien imprimer sur la console si j'utilise form-data, mais ça fonctionne très bien quand j'utilise x-wwww-form-urlencoded. J'ai utilisé multer middle ware, je n'ai toujours rien reçu. Le middle ware entre en jeu quand mon back-end recevra quelque chose. J'ai essayé d'obtenir les champs de texte en clair de form-data, et je ne reçois pas cela non plus. Cela signifie que mon serveur principal ne peut pas recevoir tous les champs form-data, pas seulement les fichiers mais aussi les champs de texte.

+0

vous devez passer req.body formulaire Le formulaire-data @HafizTemuri – muthukumar

+0

@muthukumar désolé je n'ai pas attrapé cela. Pourriez-vous élaborer pour moi, s'il vous plaît? –

+0

votre problème n'est pas avec les en-têtes Bien vouloir passer le multer Middle Ware – muthukumar

Répondre

0

exemple express Voici mon super simple:

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!') 
}) 

Désolé, je ne pas utiliser postier, mais je l'utilise curl et ça marche pour moi:

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

Vous peut l'essayer, le tester, obtenir l'essentiel et jouer avec votre application en utilisant cette commande curl.

+0

En utilisant votre solution, au moins, je suis en mesure d'obtenir des champs de texte lorsque j'utilise 'form-data' dans Postman, ce qui est un progrès, dis-je. Je ne suis toujours pas capable d'obtenir le fichier J'ai essayé d'utiliser curl, et il me donne une erreur, 'Invoke-WebRequest: Impossible de lier le paramètre 'Headers' Impossible de convertir la valeur" Content-Type: multipart/form-data "de tapez "System.String" pour taper "System.Collections.IDictionary" '. Toutes les idées comment je peux le résoudre? –

+0

Impossible de reproduire cette erreur ... Quels autres middlewares utilisez-vous? –

+0

nous devons localiser middleware cas cette erreur ... –

0

L'en-tête Content-Type pour le téléchargement de fichier est actuellement multipart/form-data et non form-data. Pour télécharger un fichier de manière appropriée dans Postman, veuillez consulter ici: https://github.com/postmanlabs/postman-app-support/issues/1441#issuecomment-289452571

Dans le backend, vous avez besoin d'une bibliothèque pour gérer la demande multipart/form-data. Si vous utilisez express.js alors cette bibliothèque serait répondre à vos besoins https://www.npmjs.com/package/multer

Voici comment utiliser la bibliothèque multer

1) installer d'abord multer

npm install --save multer 

2) Inclure la bibliothèque dans votre code (notez que le répertoire uploads doit être existant)

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

3) Utilisez upload comme middleware pour votre point final add_user (remplir les parenthèses avec votre nom de domaine qui contiennent fichier uploadé)

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

4) Le fichier est accessible dans votre user_api_controller.js

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

J'ai changé le type d'en-tête en 'multipart/form-data'. Pourtant, cela ne me montre aucun signe de réception des données au back-end. J'ai inclus plus de code dans mon message original. S'il vous plaît vérifiez si je fais quelque chose de mal là-bas. –

+0

Pour recevoir le fichier au backend, vous devez utiliser une autre bibliothèque 'multer'. J'ai mis à jour ma réponse pour donner quelques instructions. –

+0

toujours rien. Bien qu'il crée le dossier de téléchargement, mais il ne télécharge pas le fichier. Quand j'utilise 'form-data', pas seulement les fichiers, il n'obtient pas non plus les champs de texte. –