Как читать данные формы в nodejs

#node.js #angular

Вопрос:

Я использую ionic angular в интерфейсе, и я пытаюсь отправить данные формы, которые содержат файл, а также 2 строки. По-видимому, его отправляют, однако я не знаю, как прочитать эту информацию на стороне сервера

внешний интерфейс

 private fil3: File;  changePicture(fileChangeEvent){//this functions is called by an input file  this.fil3 = fileChangeEvent.target.files[0];    let a1 = "a1"  let a2 = "a2"   let b1 = "b1"  let b2 = "b2"   let formData = new FormData();    formData.append('photo', this.fil3, this.fil3.name);  formData.append(a1, a2);  formData.append(b1, b2);    fetch('http://localhost:3000/up', {  method: 'POST',   body: formData,   headers:{  /* 'Content-Type': 'application/json' */  'Content-Type': "multipart/form-data"  },  mode: "cors",  }).then(res =gt;{ res.json().then((data)=gt;{    console.log("filename: " data.filename);   console.log("originalname: " data.originalname);   console.log("message: " data.message);   this.avatar="../../assets/uploads/" data.filename    })   })   .catch(error =gt; {console.error('Error:', error)})  .then(response =gt; {console.log(response)});  }//changePicture  

сервер

 function updatePicture (req, res) {   console.log("req.body: " req.body)   }   

На стороне сервера я просто пытаюсь прочитать каждый элемент данных формы по отдельности, чтобы работать с ними. Этими элементами являются файл и две другие строки(a1,a2,b1,b2). Эта консоль.войдите на сервер, чтобы распечатать это req.body: [object Object]

Я пробовал такие вещи, как

 console.log("req.body: " req.body.a1)  console.log("req.body: " req.body.[1])  

но, конечно , это не сработает, я понимаю undefined , я понятия не имею, как с этим справиться, есть какие-нибудь советы?

МИНИМАЛЬНО ВОСПРОИЗВОДИМЫЙ КОД СЕРВЕРНОЙ ЧАСТИ

 const express = require ('express') const bodyParser = require ('body-parser') const app = express() const api = express.Router() const cors = require('cors')   app.use(bodyParser.urlencoded({ extended:false})) app.use(bodyParser.json())    app.use(cors({  origin: true }));   const PORT = 3000; app.listen(config.port, ()=gt;{  console.log(`Server running on port: ${PORT}`) })   api.post('/up', (req, res) =gt;{  console.log(req.body)  })  

Комментарии:

1. Сделайте console.log(req.тело).

2. Вы настроили промежуточное программное обеспечение для анализа данных формы?

3. @MikeOne Это первое, что я сделал, я поместил его в код сервера выше, я получил [req.body: [объект объекта]] в качестве ответа. eol Я не думаю, что я это сделал, но действительно ли это необходимо? Я не знаю, как утешить. также войдите в систему спереди, как я могу увидеть эти данные внутри данных формы?

4. @rottenCoderSo Просто console.log(req.body) не console.log("req.body: " req.body) так, как сказал @MikeOne, потому что он преобразуется в строку, и поэтому данные скрыты.

5. @RAZAFINARIVOHanania интересно, я только что сделал это и получил это {}

Ответ №1:

Во-первых, удалите эту часть :

 headers:{  /* 'Content-Type': 'application/json' */  'Content-Type': "multipart/form-data" }  

потому что, если вы определяете Content-Type вручную, вы не можете сообщить об boundary информации. Это должно управляться автоматически браузером, потому что вы тоже отправляете файлы.

Во-вторых, вам нужна библиотека для анализа ваших данных, состоящих из нескольких частей. Вы можете использовать formidable :

 const formidable = require('formidable');  //You're other codes  app.post('/up', (req, res) =gt; {  const form = formidable({ multiples: true });  form.parse(req, (err, fields, files) =gt; {  console.log('fields: ', fields);  console.log('files: ', files);  res.send({ success: true });  }); });  

С моей стороны это бревно что-то вроде :

 fields: { a1: 'a2', b1: 'b2' } files: { file: PersistentFile {  ...  

Комментарии:

1. Боже, вы абсолютно правы, сэр, это работает как заклинание. Вы великолепны, спасибо

2. @rottenCoderSo Добро пожаловать 🙂