如何解决如何在Node.js中读取和打开两个不同的文件?
我在这段代码中观察到,在读取文件后我们无法打开文件。
计算机抱怨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',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);
解决方法
问题是argResult.end();
,这是在读取z.html
之后立即返回的,并且当读取mynewfile1.txt
时,标头已经发送到客户端。您正在尝试再次发送,这在技术上是不可能的。您只需发送一次响应。
argResult
是流。在第一个objFS.readFile
调用中,您将结束argResult
流,然后再次尝试在第二个argResult
调用中写入objFS.readFile
流。这就是为什么您得到此错误。
问题不在于文件访问。如果删除http侦听器并运行代码,则在控制台中将看不到任何错误。
,您正在使用argResult.end();两次。您不能发送两次响应。 对于此问题,您需要使用promise读取文件并在回调后解决它们。您可以使用
Promise.All([promise1,promise2]).then((data)=>{
argResult.end();
})
这里promise1是第一个文件读取器,promise2是第二个文件读取器
然后在两个诺言都得到解决时将响应发送回去
,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',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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。