node.js - 使用护照登录时出现 TypeError 时出现问题:req.flash
问题描述
我遇到了与其他堆栈溢出线程几乎相同的问题,但是给出的解决方案似乎都不起作用。
这是我尝试登录时收到的错误消息:
TypeError: req.flash is not a function
at index.js:151:5
以下是路由index.js文件中的重要部分
router.get("/login", function(req, res) {
res.render("login", {message: req.flash('error')});
});
// login Process
router.post("/login", function(req, res, next) {
passport.authenticate('local', {
successRedirect:'customer/dashboard',
failureRedirect:'/login',
failureFlash: true
})(req, res, next);
});
**// this where im getting an error**
module.exports = router;
所以错误指向 router.post ,它在我的passport.js文件中调用 LocalStrategy :
module.exports = function(passport) {
//LocalStrategy
passport.use(new LocalStrategy(function(email, password, done) {
let query = {email: email};
// checking the name in the database against the one submitted on the form
Customer.findOne(query, function(err, customer) {
if (err) throw err;
if (!customer) {
return done(null, false, { message : 'No such password', type : 'error' });
}
//Match password
bcrypt.compare(password, customer.password, function(err, isMatch) {
if (err) throw err;
if (isMatch) {
return done(null, customer);
} else {
return done(null, false, { message : 'No such password', type : 'error' });
// if the password isnt an matc return wrong password
}
});
});
})
);
}
passport.serializeUser(function(customer, done) {
done(null, customer.id);
});
passport.deserializeUser(function(id, done) {
Customer.findById(id, function(err, customer) {
done(err, customer);
});
});
并且我的login.ejs文件具有文档中所述的代码:
<% if (message.length > 0) { %>
<div class="alert alert-danger"><%= message %></div>
<% } %>
我已经检查了所有内容,包括我的 app.js 文件中的依赖项配置:
// Passport Config
require('./config/passport')(passport);
// Passport Middleware
app.use(passport.initialize());
app.use(passport.session());
app.use(cookieparser());
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
// parse application/json
app.use(bodyParser.json())
app.listen(3000, function() {
console.log('server is running');
});
app.use(flash());
app.use(routes);
请帮忙!我在这个错误上花了大约 11 个小时。
解决方案
在您对 的调用中passport.authenticate
,您传递res
了两次:
passport.authenticate('local', {
successRedirect:'customer/dashboard',
failureRedirect:'/login',
failureFlash: true
})(res, res, next);
^^^ ^^^
显然,第一个应该是req
。
但除此之外,我看不到req
在passport.js
. 如果您需要访问req
策略处理程序内部,则需要设置passReqToCallback
选项:
passport.use(new LocalStrategy({ passReqToCallback : true }, function(req, email, password, done) {
...
}));
此外,在调用 时done
,您需要对第三个参数使用固定格式:
{ message : 'No such password', type : 'error' }
并且在渲染时:
res.render("login",{ message: req.flash('error') });
推荐阅读
- node.js - Node.js 发出包含数组的数据?
- google-bigquery - 如何组合两个表,以便新表只有第一个的新记录和第二个的所有其余记录?
- mysql - 如何在服务器上的所有数据库中的所有表上授予 Select?
- android - 我的广告没有展示
- php - 插入的值保持为 0
- asp.net - 如何在 asp.net MVC 中从数据库中制作轮播图像滑块?
- javascript - 如何根据选择 id 和电台名称更改文本
- javascript - Sequelize - 将日期列更改为无毫秒
- scala - Scala:广义类型约束是“类型运算符”吗?
- nativescript - Nativescript - 使用 Android 的列表视图崩溃