Загрузите изображение и прочитайте json с помощью express js

#javascript #node.js #express

Вопрос:

Проблема: Попытка получить строку json, но req.body в обработчике данных post возвращает неопределенное значение. Возможно ли вообще отправить json и файл в одном запросе post на сервер?

Код:

Данные, отправленные на сервер:

 function saveFile(e) {
    let info = {titleI: title.value, dirI: dir.value};
    let xhr = new XMLHttpRequest();
    let formData = new FormData();
    let file = e;     

    formData.append("info", JSON.stringify(info));   
    formData.append("file", file);

    xhr.onreadystatechange = state => { console.log(xhr.status); }
    xhr.timeout = 5000;
    xhr.open("POST", '/register'); 
    xhr.send(formData);

}
 

Обработчик данных post:

 router.post("/", (req, res) => {

    console.log(req.body.info)

    var fstream;
    req.pipe(req.busboy);
    
    req.busboy.on('file', function (fieldname, file, filename) {

        let dirName = "a"
        
        fs.mkdir("D:/node website/ipgrabber/files/" dirName "/", function(err) {
            if (err) {
              console.log(err)
            }
        })

        fstream = fs.createWriteStream("D:/node website/ipgrabber/files/" dirName "/"   filename);
        file.pipe(fstream);

        fstream.on('close', function () {                
            res.redirect('back');
        });
    });
})  
 

Это основной класс:

 var express = require('express')
var http = require('http')

const mongoose = require('mongoose')
const { json } = require('express')
var cookieParser = require('cookie-parser')

var app = express()
var server = http.createServer(app)

const bodyParser = require('body-parser')
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended: true}));

var busboy = require('connect-busboy');
app.use(busboy()); 

//error handler
mongoose.connect('mongodb://localhost:27017/grabber', {useNewUrlParser: true, useUnifiedTopology: true});

app.use(cookieParser())

app.set("view engine", "ejs")

app.set('views', __dirname '/views/html/');

app.use("/js", express.static(__dirname   "/views/js"))
app.use("/css", express.static(__dirname   "/views/css"))

const registerRoute = require("./routes/register")
const grabberRoute = require("./routes/grabber")

app.use("/register", registerRoute)
app.use("/id", grabberRoute)

app.get("/", (req, res) => {
    
    res.redirect("/register")
})


app.use(function (err, req, res, next) {
    res.status(400).send("Error code: 2 <hr> This page is currently inaccessible! <br> <a href='/'>GO TO HOMEPAGE</a>")

    console.log(err)
})

server.listen(80)
 

Ресурсы проекта:

анализатор тела — 1.19.0

подключение-помощник официанта — 0.0.2

анализатор файлов cookie — 1.4.5

crypto-js 4.0.0

ejs 3.1.5

экспресс 4.17.1

мангуст 5.11.19

Ответ №1:

По умолчанию express не может правильно получить данные из нескольких частей/форм. Вы должны использовать промежуточное программное обеспечение для обработки и анализа этого запроса. Я рекомендую использовать мультер.

В вашем случае вы используете connect-помощник официанта, поэтому информация должна обрабатываться следующим образом:

     req.busboy.on('field', function(key, value, keyTruncated, valueTruncated) {
        console.log('your info is here', key, value);
    });