2015-04-24 2 views
2

Я пытаюсь загрузить документ, используя следующий код.Загрузка документа в NodeJs с использованием модуля Fs: Ошибка: запись после конца

Я искал googled и еще не нашел решение.

app.post('/documents', function (req, res) { 

    var document = {}; 

    var fstream = null; 

    // populate fields 
    form.on("field", function (name, value) { 
     document[name] = value ; 

    }); 

    form.on("part", function (part) { 

     if (!part.filename) { 
      return; 
     } 

     var path = __dirname + '/files/' + part.filename; 

     fstream = app.npm.fs.createWriteStream(path); 

     document.type = part.headers["content-type"] 
     document.name = part.filename; 
     document.size = part.byteCount; 
     document.path = path; 

     fstream.on("close", function() { 
      db.sequelize.models.Document.create(document).then(function (newDocument) { 
        res.send(newDocument) 
        res.end(); 
       }, 
       function (error) { 
        res.send(error); 
       }); 
     }); 
     part.pipe(fstream); 

    }); 

    form.on("close", function (data) { 

     fstream.end(); 
     fstream = null; 

    }); 

    form.parse(req); 
}); 

ПРИМЕЧАНИЕ: Я использую модуль fs. https://nodejs.org/api/fs.html

Первое изображение работает нормально. но когда я пытаюсь загрузить другое изображение, оно выдает исключение:

events.js: 72 throw er; // необработанное 'ошибка' событие ^

Error: write after end at writeAfterEnd (_stream_writable.js:132:12) at Form.Writable.write (_stream_writable.js:180:5) at write (_stream_readable.js:601:24) at flow (_stream_readable.js:610:7) at IncomingMessage.pipeOnReadable (_stream_readable.js:642:5) at IncomingMessage.emit (events.js:92:17) at emitReadable_ (_stream_readable.js:426:10) at emitReadable (_stream_readable.js:422:5) at readableAddChunk (_stream_readable.js:165:9) at IncomingMessage.Readable.push (_stream_readable.js:127:10)

+0

Пожалуйста, не используйте 'eval()' like this ([читайте здесь почему нет] (http://blog.gdssecurity.com/labs/2015/4/15/nodejs-server-side-javascript-injection- detect-exploitati.html)) – robertklep

+0

@robertklep полностью согласен! будет дальнейший рефакторинг на этом .... однако я не мог найти другого способа установить поток с несколькими частями с данными формы. – codebased

+1

'document [name] = value'? – robertklep

ответ

5

Найдено решение.

var form = new app.npm.multiparty.Form();

Это было определено на глобальном уровне. Где для каждого нового запроса я должен создать новый экземпляр формы, потому что поток отключен в предыдущем вызове, поэтому я должен создать новый экземпляр, получив последнее содержимое.

Решение выглядит любит:

app.post ('/ документы', функция (Req, Рез) {

var document = {}; 

var form = new app.npm.multiparty.Form(); 

var fstream = null; 

...

А остальное же

.
+0

Да, я совершил ту же ошибку. Глядя более четко на [documentation] (https://github.com/andrewrk/node-multiparty), он ясно показывает, что 'multiparty.Form' создается в каждом вызове обратного вызова, переданного на' http.createServer' (каждый запрос). И я тоже просмотрел это, закончив поиск «Многопартийной ошибки: напиши после конца», что привело меня к вашему вопросу. – Shiprack

Смежные вопросы