#javascript #node.js #fs
#javascript #node.js #fs
Вопрос:
Я заметил в этом коде, что мы не можем открыть файл после того, как мы прочитали файл.
Компьютер жалуется на Error [ERR_STREAM_WRITE_AFTER_END]: write after end
Конечно, если я удалю readFile
функцию, эта ошибка исчезнет, но я хочу понять, почему возникает эта ошибка, хотя я использую два разных файла для чтения и открытия.
Каков способ чтения и открытия двух разных файлов?
var objHttp = require('http');
var objFS = require('fs');
objHttp.createServer(function(argClientRequest, argResult) {
objFS.readFile('z.html',
function(argError, argData) {
argResult.writeHead(200, {
'Content-Type': 'text/html'
});
argResult.write(argData);
argResult.end();
}
);
objFS.open('mynewfile1.txt', 'r', (argErr, argFD) => {
if (argErr) throw argErr;
objFS.readFile('mynewfile1.txt',
function(argError, argData) {
if (argError) throw argError;
argResult.writeHead(200, {
'Content-Type': 'text/html'
});
argResult.write(argData);
return argResult.end();
}
);
objFS.close(argFD, (argErr) => {
if (argErr) throw argErr;
});
});
}).listen(8080);
Ответ №1:
var objHttp = require('http');
var objFS = require('fs');
function firstReader(argResult){
return new Promise(function(resolve,reject){
objFS.readFile("z.html",
function(argError, argData) {
argResult.writeHead(200, {
'Content-Type': 'text/html'
});
argResult.write(argData);
}
);
})
}
function secondReader(argResult){
return new Promise(function(resolve,reject){
objFS.open('mynewfile1.txt', 'r', (argErr, argFD) => {
if (argErr) throw argErr;
objFS.readFile('mynewfile1.txt',
function(argError, argData) {
if (argError) reject();
argResult.writeHead(200, {
'Content-Type': 'text/html'
});
argResult.write(argData);
}
);
objFS.close(argFD, (argErr) => {
if (argErr) reject();
});
});
})
}
objHttp.createServer(function(argClientRequest, argResult) {
Promise.all([firstReader(argResult),secondReader(argResult)]).then(function(){
argResult.end();
}).catch(function(){
argResult.end();
})
}).listen(8080);
Ответ №2:
Проблема argResult.end();
в том, что это возвращается сразу после чтения z.html
и при mynewfile1.txt
чтении заголовков и уже отправляется клиенту. Вы пытаетесь отправить его снова, что технически невозможно. Вам нужно будет отправить ответы только один раз.
Ответ №3:
argResult
это поток. В первом objFS.readFile
вызове вы завершаете argResult
поток, а затем снова пытаетесь выполнить запись в argResult
поток во втором objFS.readFile
вызове. Вот почему вы получаете сообщение об ошибке.
Проблема не в доступе к файлам. Если вы удалите http-прослушиватель и запустите код, вы не увидите ошибки в консоли.
Ответ №4:
вы используете argResult.end(); дважды. Вы не можете отправить ответ дважды. Для этой проблемы вам нужно использовать promise для чтения файла и устранения их после обратного вызова. Вы можете использовать
Promise.All([promise1,promise2]).then((data)=>{
argResult.end();
})
здесь promise1 — это первый файл для чтения, а promise2 — второй файл для чтения
а затем отправьте ответ обратно, когда оба обещания будут разрешены