Как прочитать и открыть два разных файла в nodejs?

#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 — второй файл для чтения

а затем отправьте ответ обратно, когда оба обещания будут разрешены