Я застрял со следующей проблемой после нескольких часов исследований. Я видел много вопросов и ответов на эту тему, но у меня ничего не получилось: (
Я создаю приложение Electron, в котором есть функция загрузки файлов с помощью перетаскивания. Я использую express
сервер с multer
реализован для обработки загрузки файлов. Загрузка файлов работает нормально, когда я использую fetch
:
Клиентская сторона:
uploadFile = (file) => {
formData.append('file', file);
}
var formData = new FormData();
([...files]).forEach(uploadFile);
fetch('/uploadLogs', {
method: 'POST',
body: formData
}).then(...)
Серверная сторона
var express = require('express');
var bodyParser = require('body-parser')
var multer = require('multer');
var app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
var memStorage = multer.memoryStorage();
var uploadToMemory = multer({ storage: memStorage })
app.post('/uploadLogs', uploadToMemory.any(), (req, res, next) => {
const files = req.files;
if (!files) {
const error = new Error('Please choose files')
error.httpStatusCode = 400
return next(error)
}
...
})
Я использую DataTables
и пытаюсь использовать серверный рендеринг , который использует JQuery / AJAX для загрузки данных с сервера вместо клиента, потому чтоЯ ожидаю, что миллионы строк будут возвращены с сервера при загрузке файла (по этой причине мне нужно прекратить использовать fetch
). Когда я изменяю код клиентской стороны следующим образом:
$('#table').DataTable( {
serverSide: true,
ajax: {
url: url,
method: 'POST',
data: formData,
cache: false,
contentType: false,
processData: false,
success: function(data){
console.log(data);
},
error: function(err) {
console.error(err)
}
},
// data: logs,
columns: tableHeaders
});
Я получаюследующее сообщение об исключении в ответе с кодом ответа 500
:
Error: Please choose files
at app.post (/Users/me/dev/logreader/server/app.js:41:21)
at Layer.handle [as handle_request] (/Users/me/dev/logreader/node_modules/express/lib/router/layer.js:95:5)
at next (/Users/me/dev/logreader/node_modules/express/lib/router/route.js:137:13)
at multerMiddleware (/Users/me/dev/logreader/node_modules/multer/lib/make-middleware.js:18:41)
at Layer.handle [as handle_request] (/Users/me/dev/logreader/node_modules/express/lib/router/layer.js:95:5)
at next (/Users/me/dev/logreader/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/Users/me/dev/logreader/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/Users/me/dev/logreader/node_modules/express/lib/router/layer.js:95:5)
at /Users/me/dev/logreader/node_modules/express/lib/router/index.js:281:22
at Function.process_params (/Users/me/dev/logreader/node_modules/express/lib/router/index.js:335:12)
У меня есть два вопроса:
1) Как решить эту проблему? Я прочитал в нескольких местах ( здесь , здесь ), что мне нужно установить:
contentType: false,
processData: false,
свойства в конфигурации AJAX для сброса типа содержимого.
2) Почему я получаю ошибку 500
, хотя я явно установил ошибку на 400
?