gpt4 book ai didi

javascript - 每次 var 更改后更新 res.locals 吗?

转载 作者:行者123 更新时间:2023-12-03 00:32:26 26 4
gpt4 key购买 nike

我正在尝试构建自己的即时消息,但以一种更简单的方式。它看起来像这样:

var errCode = 0;

router.use(function(req, res, next)
{
res.locals.errCode = errCode;
next();
});

router.post('/login', middleware.access, function(req, res, next) {
passport.authenticate('local', function(err, user) {
if (err) { return next(err); errCode = 1;}
if (!user) { return res.redirect('/login'); errCode = 2;}
req.logIn(user, function(err) {
if (err) { return next(err); errCode = 1;}
return res.redirect('/regiune/' + req.body.regiune);
});
})(req, res, next);
});

和 EJS

<% if(errCode === 1){ %>
<span class="login-error">err1</span><br/>
<% } %>
<% if(errCode === 2){ %>
<span class="login-error">err2</span><br/>
<% } %>
<% if(errCode === 3){ %>
<span class="login-error">err3</span><br/>
<% } %>

我的想法的问题是 errCode 传递的值为 0,因为这是它最初的值。有什么方法可以在 errCode 更改时更新 res.locals.errCode 吗?

最佳答案

使用全局变量在路由/中间件之间传递数据是一个非常糟糕的主意,因为您总是必须假设可能有两个请求同时到达您的服务器,然后 errorCode将被一个请求覆盖,然后才能被另一请求用于渲染。您必须使用相应的对象来存储请求/响应/任务相关变量。

而你从未设置errorCode到不同的东西0 。因为前面总是有一个 return 语句,例如:

return next(err); // the function is exit here before the next statement is executed
errCode = 1; // is never executed because this is unreachable code

中间件按照它们附加的顺序执行,所以如果你写:

router.use(function(req, res, next) {
// ...
})

router.post('/login', middleware.access, function(req, res, next) {
// ...
})

那么use的代码是在post的on之前执行的,所以即使errCode那么 res.locals.errCode = errCode 就会被设置将在 errCode 之前执行设置后,它将获得先前的值 errCode .

所以你的代码必须如下所示:

router.post('/login', middleware.access, function(req, res, next) {
passport.authenticate('local', function(err, user) {
if (err) {
res.locals.errCode = 1;
return next(err);
}
if (!user) {
res.locals.errCode = 2;
// THIS WON'T WORK: because the `res.locals.errCode` will not
// survive the redirect you need to use sessions here or pass the
// error with the redirect
return res.redirect('/login');
}
req.logIn(user, function(err) {
if (err) {
res.locals.errCode = 1;
return next(err);
}
return res.redirect('/regiune/' + req.body.regiune);
});
})(req, res, next);
});

关于javascript - 每次 var 更改后更新 res.locals 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53801270/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com