#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 Добро пожаловать 🙂