如何将 node.js 目录中的文件内容发送给客户端
how to send content of files within a directory on node.js to client
当我想将文件内容发送给客户端时,我收到此错误 "Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client"。
const testFolder = './uploads/';
* app.get('/filedata',function(req,res){
fs.readdir(testFolder, (err, files) => {
files.forEach(file => {
fs.readFile( testFolder+file,'utf8',(err,data)=>{
if (err) {
console.log(err);
}
console.log(data);
res.json(data);
});
});
});
});
您收到 "Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client"
错误的原因是因为您在读取第一个文件后立即发回响应,因此当您尝试发回第二个文件时,您会得到在将它们发送到客户端后无法设置 headers 的错误,即响应已经送达。有关更多详细信息,请参阅 this。
一个解决这个问题的可能方法是使用readFileSync
读取所有文件,将它们存储在object中,并在读取所有文件后成功,将它们作为响应发回。像这样,
const testFolder = './uploads/';
app.get('/filedata',function(req,res){
fs.readdir(testFolder, (err, files) => {
let allData = {}
files.forEach(file => {
let data = "";
try{
// Use readFileSync instead of readFile to avoid handling promises and read synchronously
data = fs.readFileSync(testFolder+file).toString() // Read data and convert to string
}catch(err){
console.log(err); // Any error
}
allData[file] = data; // Add to all data object with key as filename and value as data string
});
res.json(allData); // Send all data
});
});
当我想将文件内容发送给客户端时,我收到此错误 "Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client"。
const testFolder = './uploads/';
* app.get('/filedata',function(req,res){
fs.readdir(testFolder, (err, files) => {
files.forEach(file => {
fs.readFile( testFolder+file,'utf8',(err,data)=>{
if (err) {
console.log(err);
}
console.log(data);
res.json(data);
});
});
});
});
您收到 "Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client"
错误的原因是因为您在读取第一个文件后立即发回响应,因此当您尝试发回第二个文件时,您会得到在将它们发送到客户端后无法设置 headers 的错误,即响应已经送达。有关更多详细信息,请参阅 this。
一个解决这个问题的可能方法是使用readFileSync
读取所有文件,将它们存储在object中,并在读取所有文件后成功,将它们作为响应发回。像这样,
const testFolder = './uploads/';
app.get('/filedata',function(req,res){
fs.readdir(testFolder, (err, files) => {
let allData = {}
files.forEach(file => {
let data = "";
try{
// Use readFileSync instead of readFile to avoid handling promises and read synchronously
data = fs.readFileSync(testFolder+file).toString() // Read data and convert to string
}catch(err){
console.log(err); // Any error
}
allData[file] = data; // Add to all data object with key as filename and value as data string
});
res.json(allData); // Send all data
});
});