Загрузка данных формы с помощью DataTables / AJAX и NodeJS / Multer - PullRequest
0 голосов
/ 13 октября 2019

Я застрял со следующей проблемой после нескольких часов исследований. Я видел много вопросов и ответов на эту тему, но у меня ничего не получилось: (

Я создаю приложение 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?

...