2013-02-23 2 views
0
var http = require('http'); 
var fs = require('fs').createWriteStream('file1');; 

http.createServer(function(req, res) { 
    // This opens up the writeable stream to `output` 


    // This pipes the POST data to the file 
    req.pipe(fs); 

    // After all the data is saved, respond with a simple html form so they can post more data 
    req.on('end', function() { 
    res.writeHead(200, {"content-type":"text/html"}); 
    res.end('<form method="POST"><input name="test" /><input type="submit"></form>'); 
    }); 

    // This is here incase any errors occur 
    fs.on('error', function (err) { 
    console.log(err); 
    }); 
}).listen(8080); 

В приведенном выше коде я Тринга принимать входные данные из формы HTML с помощью метода POST и трубы такой же, в поток записи файла, но я не в состоянии достичь и следующее сообщение об ошибке отображаетсяNODEJS WriteStream ошибка

{ [Error: EBADF, close] errno: 9, code: 'EBADF' } 
{ [Error: EBADF, close] errno: 9, code: 'EBADF' } 
{ [Error: EBADF, close] errno: 9, code: 'EBADF' } 
{ [Error: EBADF, close] errno: 9, code: 'EBADF' } 
{ [Error: EBADF, close] errno: 9, code: 'EBADF' } 
{ [Error: EBADF, close] errno: 9, code: 'EBADF' } 
{ [Error: EBADF, close] errno: 9, code: 'EBADF' } 
{ [Error: EBADF, close] errno: 9, code: 'EBADF' } 
{ [Error: EBADF, close] errno: 9, code: 'EBADF' } 

что идет не так, какие изменения я должен сделать так, чтобы я мог успешно перенаправить данные из POST в файл ?? я прочитал этот пост, связанный Node.js EBADF error when writing file using writable stream

Но до сих пор не смогли найти выход, я NODEJS новичку, пожалуйста, помогите мне .thank вы ...

ответ

2

По умолчанию end() вызывается в пункте назначения, когда исходный поток испускает конец, так что конечный объект больше не доступен для записи. Pass {end: false} в качестве параметров, чтобы сохранить поток адресата открытым.

Вы должны просто сделать:

req.pipe(fs, { end: false }); 

и ваши ошибки будут уходить.

1

Ваша ошибка в том, что после первого времени req.pipe(fs); запускается при труба завершает его закрытие WriteStreamfs, каждый req.pipe(fs); после первого пытается записать в закрытый FD, таким образом EBADF.

Вам необходимо либо воссоздать WriteStream, либо использовать событие data непосредственно, а не использовать трубу. Но в любом случае у вас серьезная параллельная проблема. Скорее всего, вы должны создать новый WriteStream для отдельного файла для каждого запроса.

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