Я делаю предпосылку, я не фронтенд-разработчик или NodeJS эксперт. У меня проблема с nodejs при попытке загрузить файл. Это происходит в недетерминированном режиме c, иногда запрос в порядке и иногда возвращает ошибку в заголовке. На моих локальных машинах эта ошибка случается редко, но в серверной среде это происходит чаще всего. Возвращена ошибка:
executeRetriveMultipart() on response
RESPONSE.statusCode: 200
~ progress: 0/5898177
~ progress: 8701/5898177
> fileBegin name:IDC_FILE file:[object Object]
> fileBegin name:PARAMETERS_FILE file:[object Object]
> fileBegin name:INDEX_FILE file:[object Object]
< file name:IDC_FILE file:[object Object]
~ progress: 74237/5898177
> fileBegin name:DATA_FILE file:[object Object]
< file name:INDEX_FILE file:[object Object]
~ progress: 139773/5898177
< file name:PARAMETERS_FILE file:[object Object]
~ progress: 205309/5898177
~ progress: 270845/5898177
~ progress: 336381/5898177
~ progress: 400623/5898177
~ progress: 466159/5898177
X - aborted
X - error: Error: Request aborted
at IncomingMessage.<anonymous> (/opt/ndoc/js/apps/frontend/node_modules/formidable/lib/incoming_form.js:122:19)
at emitNone (events.js:86:13)
at IncomingMessage.emit (events.js:185:7)
at Socket.socketCloseListener (_http_client.js:275:13)
at emitOne (events.js:101:20)
at Socket.emit (events.js:188:7)
at TCP._handle.close [as _onclose] (net.js:501:12) Error: Request aborted
at IncomingMessage.<anonymous> (/opt/ndoc/js/apps/frontend/node_modules/formidable/lib/incoming_form.js:122:19)
at emitNone (events.js:86:13)
at IncomingMessage.emit (events.js:185:7)
at Socket.socketCloseListener (_http_client.js:275:13)
at emitOne (events.js:101:20)
at Socket.emit (events.js:188:7)
at TCP._handle.close [as _onclose] (net.js:501:12)
{ fields: {},
Я пытаюсь добавить некоторые таймауты запросов и сокетов, но безуспешно. Часть кода, которая обрабатывает загрузку с помощью multipart, приведена ниже:
var serviceOptions = {url: URL,headers: headers,timeout: 60000};
...
// EXECUTOR
executeRetriveMultipart({
debug: DEBUG,
serviceOptions: serviceOptions,
destinationFolder: destinationFolder,
callback: __makeOneShotWrapper(cb)
}
...
function executeRetriveMultipart (opts) {
var DEBUG = opts.debug;
var callback = opts.callback;
var execID = 'RetriveMultipart-'+(new Date().valueOf());
if (DEBUG) console.time(execID);
try {
req.on('response', function (response) { // fired when the headers are returned
if (DEBUG) console.log("executeRetriveMultipart() on response");
var statusCode = response && response.statusCode || 0;
if (statusCode != 200) {
if (DEBUG) console.error("Errore RetriveMultipart (statusCode != 200): "+statusCode);
return callback(new Error("Errore RetriveMultipart (statusCode != 200): "+statusCode));
}
if (DEBUG) inspect(statusCode,"RESPONSE.statusCode");
/*For me the error happens here*/
var form = new formidable.IncomingForm();
form.uploadDir = opts.destinationFolder;
form.keepExtensions = true;
if (DEBUG) attachListeners(form);
form.parse(response, function(err, fields, files) {
if (DEBUG) console.log(util.inspect({fields: fields, files: files}));
if (DEBUG) {
console.log("RetriveMultipart form.parse complete" + (err ? ' .. with ERROR!' : '.'));
}
var resultFiles = {};
try {
["IDC_FILE","PARAMETERS_FILE","INDEX_FILE","DATA_FILE"].forEach(function (file) {
resultFiles[file] = {
path: files[file].path,
name: files[file].name,
type: files[file].type,
size: files[file].size
};
});
setTimeout(function(){
callback(null, {
files: resultFiles
});
},0);
}
catch (e) {
callback(new Error("Error evaluating multipart response: "+e));
}
Для дополнительной информации я использую эту версию библиотек:
NodeJS: 13.7.0
"async": "~0.9.0",
"bunyan": "0.21.2",
"connect-redis": "^4.0.4",
"crypto-js": "~3.1.2-5",
"data2xml": "0.8.0",
"express": "3.4.4",
"express-params": "0.0.3",
"express-session": "^1.17.0",
"eyes": "0.1.8",
"form-data": "~0.1.4",
"formidable": "^1.2.1",
"http-proxy": "~1.16.2",
"jade": "0.30.0",
"jsonfile": "~2.0.0",
"less-middleware": "0.1.12",
"mkdirp": "0.3.5",
"mocha": "1.3.0",
"moment": "2.0.0",
"redis": "^3.0.2",
"request": "~2.40.0",
"riak-js": "0.9.3",
"should": "1.2.1",
"simple-errors": "0.0.4",
"stream": "0.0.2",
"underscore": "~1.6.0",
"vows": "0.7.0",
"xml2js": "0.2.3",
"xtend": "1.0.3"
Я не являюсь разработчиком внешнего интерфейса. не хотел бы переходить с express 3 на express 4, потому что это приводит к большой корректировке исходного кода.
Большое спасибо всем за поддержку