我遇到了与此另一个堆栈溢出thread几乎相同的问题,但是给出的解决方案似乎都不起作用。
这是我尝试登录时收到的错误消息:
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个小时来解决这个错误。
答案 0 :(得分:0)
在致电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') });