“TypeError: req.flash 不是一个函数”,使用带有 nodejs、用户名和密码身份验证的护照
"TypeError: req.flash is not a function" using passport with nodejs, username and password auth
这是运行并输入错误密码时的控制台输出。
info: Listening on 127.0.0.1:3000
debug: GET /
debug: Incorrect password
/home/bob/git/authenticate-nodejs-prototype/node_modules/mongodb/lib/utils.js:98
process.nextTick(function() { throw err; });
^
TypeError: req.flash is not a function
at allFailed (/home/bob/git/authenticate-nodejs-prototype/node_modules/passport/lib/middleware/authenticate.js:118:15)
这是实际代码。任何想法可能导致这种情况吗?
var express = require('express'),
app = express(),
http = require('http').Server(app),
winston = require('winston'),
passport = require('passport'),
LocalStrategy = require('passport-local').Strategy,
ipaddress = '127.0.0.1',
port = 3000,
MongoClient = require('mongodb').MongoClient,
ObjectId = require('mongodb').ObjectID,
assert = require('assert'),
mongoUrl = 'mongodb://' + ipaddress + ':27017/authenticate-nodejs-prototype',
flash = require('connect-flash');
// during dev
winston.level = 'debug';
/*
* Database query
* Searches db for user that matches provided username
*/
var findUser = function (db, id, callback) {
var cursor = db.collection('userInfo').find({username: id.username});
var result = [];
cursor.each(function (err, doc) {
assert.equal(err, null);
if (doc !== null) {
result.push(doc);
} else {
callback(result);
}
});
};
// configure passport to use username and password authentication
passport.use(new LocalStrategy(
function(username, password, done) {
MongoClient.connect(mongoUrl, function (err, db) {
assert.equal(null, err);
findUser(db, {username:username, password:password}, function (result) {
db.close();
if (err) {
return done(err);
}else if (result === []) {
winston.debug('Incorrect username');
return done(null, false, { message: 'Incorrect username.' });
}else if (password !== result.password) {
winston.debug('Incorrect password');
return done(null, false, { message: 'Incorrect password.' }); // this is the line that causes error
}
return done(null, result);
});
});
}
));
passport.serializeUser(function(user, done) {
return done(null, user);
});
passport.deserializeUser(function(id, done) {
MongoClient.connect(mongoUrl, function (err, db) {
assert.equal(null, err);
findUser(db, id, function (result) {
db.close();
return done(null, result);
});
});
});
app.configure(function() {
app.use(express.static('public'));
app.use(express.cookieParser());
app.use(express.bodyParser());
app.use(express.session({ secret: 'keyboard cat' }));
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
app.use(flash());
});
/*
* setup endpoints
*/
app.get('/', function(req, res){
winston.debug('GET /');
res.sendfile('views/index.html');
});
app.get('/success', function(req, res){
winston.debug('GET /success');
res.sendfile('views/success.html');
});
app.post('/login',
passport.authenticate('local', { successRedirect: '/success',
failureRedirect: '/',
failureFlash: true })
);
// start server
http.listen(port, ipaddress, function(){
winston.info('Listening on ' + ipaddress + ':' + port);
});
需要添加flash来表达,以便它可以作为中间件使用。
var flash = require('connect-flash');
...
app.use(flash());
编辑:原因是Flash实际上并没有内置在Passport或Express中,它是connect-flash
提供的单独软件包。所以你需要用npm安装它,然后如上所示包含它。
相关文章:
- 在Nodejs中为许多用户处理计时器
- 如何检查用户是否已经在NodeJs-Mongoose中关注其他用户
- NodeJS+JS:根据当前用户选择生成动态链接
- nodeJS视频流,当用户断开连接或移动到不同页面时,连接不会关闭
- 使用Nodejs在Mysql中插入多个值,并用响应通知用户
- 如何限制用户访问ExpressJS/NodeJS中的静态html文件
- 希望仅为已登录的用户显示链接,否则它显示该链接在AngularJS和NodeJS中被隐藏或禁用
- 使用 Mocha 在 NodeJS 和 MongoDB 中测试用户模型时没有结果
- NodeJS 服务器无法处理多个用户
- 无法在 nodeJS:TypeError 中对用户进行身份验证:无法使用“in”运算符在 fs 中搜索“用户名”
- NodeJS编辑二进制文件比将文件返回给用户
- 如何在selenium webdriver nodejs land中更改selenium用户代理
- 检测用户是否正在使用NodeJS访问我的网络(WIFI)
- 如何在Nodejs中找到所有用户的地理位置
- 在nodejs中将javascript代码发送给用户之前,我们如何执行它
- 如何检测该用户's的连接在nodejs-websocket(ws)中丢失
- NodeJS如何在多用户环境中处理基元和对象
- 如何从nodejs检查用户是否在servlet/jsp应用程序中进行了身份验证(登录)
- NodeJs-从JWT令牌中检索用户信息
- 如何获取发送数据的用户的详细信息(.emit())到nodejs服务器