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