在express应用程序中使用fs使用中间件时设置标头时出现问题



我对NodeJS还很陌生,我正在尝试构建一个简单的视频流API。我正在尝试使用中间件验证API,该中间件使用系统中的文件来检查其中是否存在电子邮件。这是它的代码:

checkUserAllowed = (req, res, next) => {
const email = req.body.email;
if (!email) {
res.status(401).send("User details not found");
return;
}
fs.readFile(dataFile, 'utf8', (err, data) => {
if (err) return false;
const emails = data.split("n");
let allowed = false;
emails.forEach((row)=>{
if (row==email) allowed=true;
next();
})

if (!allowed) res.status(401).send("User not subscribed");
return;
})
}

发送视频的区块如下:

fs.stat(path, (err, data) => {
if (err) {
console.log(err);
res.status(404).send();
return;
}
const size = data.size;
const head = {
'Content-Length': size,
'Content-Type': 'video/mp4',
}
res.writeHead(200, head);
fs.createReadStream(path).pipe(res);
}
})

然而,我在运行时遇到以下错误:

_http_outgoing.js:558
throw new ERR_HTTP_HEADERS_SENT('set');
^
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:558:11)
at ServerResponse.writeHead (_http_server.js:289:21)
at /<path>/stream.js:51:17
at FSReqCallback.oncomplete (fs.js:184:5) {
code: 'ERR_HTTP_HEADERS_SENT'
}

有线索吗?

在循环中调用next((时犯了一个愚蠢的错误。

最新更新