我有一个小问题谁阻止了我。我用nodeJS创建了一个小API,我想发送文件内容。
我用棱角分析恢复数据。
错误:发送后无法设置标头。
router.get('/posts', (req, res) => {
fs.readdir('./maps', function(error, files) {
if(error)
throw error;
files.forEach(file => {
fs.readFile(file, (err, data) => {
res.send(data);
});
});
})
});
感谢您的帮助。
答案 0 :(得分:0)
您无法向请求发送多个回复。你必须同步读取所有文件并使用你得到的所有文件制作一个res.send。
答案 1 :(得分:0)
你不能在for循环中调用res.send()。它必须只执行一次,因为它将响应发送回api的调用者。你可以做的是在for循环中连接响应并在结束时发送它。
router.get('/posts', (req, res) => {
fs.readdir('./maps', function(error, files) {
if(error)
throw error;
var responseData = '';
files.forEach(file => {
fs.readFile(file, (err, data) => {
responseData += data;
});
});
res.send(responseData);
})
});
答案 2 :(得分:0)
问题在于,在上面的代码中,您每次读取文件时都会尝试发送响应
files.forEach(file => {
fs.readFile(file, (err, data) => {
res.send(data);//repeated sending of response
});
});
如果您计划在读取所有文件后发送响应并行读取所需文件,并且一旦完成所有读取,则可以发送响应。为此,您可以使用async或promise库来帮助您轻松完成此操作
async.each(files, function(file, callback) {
fs.readFile(file, (err, data) => {
callback();
});
}, function(err) {
res.send(data);
});
因此,只有在读取所有文件后才会发送响应。