express.js重定向发送后无法设置标头

时间:2020-08-05 08:42:17

标签: node.js express

我尝试通过将用户重定向到主页来阻止对Json文件的访问。

当尝试访问文件时,即使可以工作,我也会收到“发送后无法设置标题”的信息。

如果我删除app.use(express.static(__dirname));,不会收到此错误,但我不知道为什么。

app.get('/', function(req, res){
    res.sendFile(__dirname +'/index.html');
});

// Protect file
app.use(function(req, res, next) {
    if (req.user == null && req.path === '/File.json')
    {
        res.redirect('/');
    }
    next(); 
});

app.use(express.static(__dirname));

2 个答案:

答案 0 :(得分:0)

那是因为您要在发送响应res.redirect('/')之后尝试设置标头,而static static试图将标头设置为已发送的响应

答案 1 :(得分:0)

这是因为next回调在您res.redirect之后被称为事件

// Protect file
app.use(function(req, res, next) {
    if (req.user == null && req.path === '/File.json') {
        res.redirect('/');
    }
    next(); 
});

如您所见,没有任何东西可以阻止执行next回调。为避免您可以将其包装在if... else ...语句中,也可以在return之前添加res.redirect

这意味着即使此条件req.user == null && req.path === '/File.json'被匹配。 IF语句内部的所有块的执行以及IF语句外部的块的执行。因此,将执行next回调,该回调将调用堆栈中的下一个中间件express.static,并且通过这种方式,中间件将尝试呈现File.json,该中间件将在重定向已执行。