Загрузка файла зависает в производственном коде, но работает локально - multer, node.js

Я работаю над приложением, которое было написано в Express 3, теперь мы обновились до Express 4, и у меня проблема с загрузкой файлов. Все работает на моем локальном компьютере Mac OSX, но не работает на производственном сервере в Ubuntu.

Я загружаю zip-файлы с png и psd внутри.

Я загружаю файл в многостраничной форме: с многопользовательским промежуточным программным обеспечением.

Локально все в порядке, но на продакшене связь разрывается. Файл начинает загружаться в основной корень загрузки, но как часть блока, например, я загружаю zip-файл размером 50 МБ, но загруженный файл имеет размер около 30 КБ, и соединение прервано, потому что событие onFileDataupload, которое загружает данные в виде блоков, было прервано.

настройки в app.js

мои настройки парсера тела:

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }) );

мои настройки мультера:

app.use(multer({
dest: './upload',
limits: {
fieldNameSize: 500,
files: 2,
fields: 20,
fileSize: 200 * 1024 * 1024
},
rename: function (fieldname, filename) {
  return fieldname + filename + Date.now();
},
onFileUploadStart: function (file) {
 console.log('Upload starting for filename: ' + file.originalname);
},
onFileUploadData: function (file, data) {
  // console.log(data.length + ' of ' + file.fieldname + ' arrived')
},
onParseStart: function () {
  console.log('Form parsing started at: ', new Date())
},
onParseEnd: function (req, next) {
 console.log('Form parsing completed at: ', new Date());
  // usage example: custom body parse
  //req.body = require('qs').parse(req.body);
  // call the next middleware
  next();
},
onFileUploadComplete: function (file) {
  console.log(file.fieldname + ' uploaded to ' + file.path);
},
onFileSizeLimit: function (file) {
  console.log('Failed: ', file.originalname)
  fs.unlink('./' + file.path) // delete the partially written file
},
onFilesLimit: function () {
  console.log('Crossed file limit!')
},
onFieldsLimit: function () {
  console.log('Crossed fields limit!')
},
onPartsLimit: function () {
  console.log('Crossed parts limit!')
},
onError: function(error, next) {
  console.log("Error occurred while uploading the file!!");
  next(error);
  } 

}));

Я пробовал также грозную альтернативу, и у меня такая же проблема, работает локально, не работает над производственной средой. И я думаю, что это может быть проблемой при обработке запросов по узлам. В производственной среде мы используем pm2. Smoething разрывает соединение во время загрузки файла.

У кого-нибудь была маби подобная проблема и нашла решение? Спасибо


person Martin Kuzdowicz    schedule 14.04.2015    source источник


Ответы (1)


Вероятно, у вас есть pm2 с включенной опцией "смотреть"; и загружать файлы в наблюдаемую директорию. Затем pm2 перезапускает приложение каждый раз, когда вы начинаете писать новые файлы (из-за перезагрузки кода).

Чтобы проверить, решает ли это вашу проблему, просто отбросьте «watch»: true из файла jour process.json или удалите флаг --wath из командной строки. Если он работает, прочтите об игнорировании часов pm2 здесь: https://github.com/Unitech/PM2/blob/master/ADVANCED_README.md#watch--restart и правильно настройте его для своей среды и приложения.

person konradkg    schedule 14.04.2015