简体   繁体   English

丢人 // Node&Passport的未处理“错误”事件

[英]Getting throw er; // Unhandled 'error' event for Node & Passport

I'm trying to build a user authentication system into my Node app with Passport.js. 我正在尝试使用Passport.js将用户身份验证系统构建到我的Node应用程序中。 When I try to sign up as a new user, it seems to work fine. 当我尝试注册为新用户时,它似乎工作正常。 But when I try logging in, the command prompt gives me this: 但是,当我尝试登录时,命令提示符将显示以下内容:

  throw er; // Unhandled 'error' event
  ^

TypeError: done is not a function
    at C:\spectray\config\passport.js:55:22
    at C:\spectray\node_modules\mongoose\lib\model.js:3419:16
    at C:\spectray\node_modules\kareem\index.js:212:48
    at C:\spectray\node_modules\kareem\index.js:127:16
    at _combinedTickCallback (internal/process/next_tick.js:67:7)
    at process._tickCallback (internal/process/next_tick.js:98:9)

Here's my passport.js file: 这是我的password.js文件:

var passport = require('passport'), LocalStrategy = require('passport-local').Strategy;

var User = require('../app/models/user');

passport.serializeUser(function(user, done) {
    done(null, user.id);
});

passport.deserializeUser(function(id, done) {
    User.findById(id, function(err, user) {
        done(err, user);
    });
});

passport.use('local-signup', new LocalStrategy({

    passReqToCallback : true
},

    function(req, email, password, done) {

        process.nextTick(function() {

            User.findOne({ 'local.email' : email}, function(err, user) {
                if (err)
                    return done(err);

                if (user) {
                    return done(null, false, req.flash('signupMessage', 'That email is already taken.'));
                } else {

                    var newUser = new User();

                    newUser.local.email = email;
                    newUser.local.password = newUser.generateHash(password);

                    newUser.save(function(err) {
                        if (err)
                            throw err;
                        return done(null, newUser);
                    });
                }
            });
        });
}));

passport.use(new LocalStrategy({

    passReqToCallback : true
},

function(username, password, done) {

    User.findOne({ username: username }, function(err, user) {
        if (err) { return done(err); }
        if (!user) {
            return done(null, false, { message: 'Incorrect username.' });
        }
        if (!user.validPassword(password)) {
            return done(null, false, { message: 'Incorrect password.' });
        }
        return done(null, user);
    });
}
));

And here's my server.js file: 这是我的server.js文件:

var express = require('express');
var app = express();
var port = process.env.PORT || 8080;
var mongoose = require('mongoose');
var passport = require('passport');
var morgan = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var session = require('express-session');
var flash = require('connect-flash');
var db = require('./config/database.js');
var favicon = require('serve-favicon');

app.use(favicon(__dirname + '/public/imgs/favicon.ico'));

mongoose.Promise = global.Promise;

mongoose.connect(db.url);
require('./config/passport');

app.use(morgan('dev'));
app.use(cookieParser());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

app.set('view engine', 'ejs');

app.use(session({ secret: 'penniesfromheaven', resave: true, saveUninitialized: true }));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());

app.use(express.static(__dirname + '/public'));

require('./app/routes.js')(app, passport);

app.listen(port);
console.log('The magic happens on port ' + port);

I tried deleting my node_modules folder and running npm install, but this error still shows up. 我尝试删除node_modules文件夹并运行npm install,但是此错误仍然显示。 What am I doing wrong? 我究竟做错了什么?

Because you are setting the passReqToCallback option to true in the LocalStrategy constructor, your callback function gets called with these arguments: (req, username, password, done) , but your function is accepting (username, password, done) , which is why the arguments are getting assigned to the wrong parameters (and thus why done isn't a function as the error message says). 由于您在LocalStrategy构造函数中将passReqToCallback选项设置为true ,因此您的回调函数将使用以下参数调用: (req, username, password, done) ,但是您的函数正在接受(username, password, done) ,这就是为什么参数正被分配给错误的参数(因此,为什么done不如错误消息所示的功能)。 To fix this, try removing the passReqToCallback option, like this: 要解决此问题,请尝试删除passReqToCallback选项,如下所示:

passport.use(new LocalStrategy(function(username, password, done) {

    User.findOne({ username: username }, function(err, user) {
        if (err) { return done(err); }
        if (!user) {
            return done(null, false, { message: 'Incorrect username.' });
        }
        if (!user.validPassword(password)) {
            return done(null, false, { message: 'Incorrect password.' });
        }
        return done(null, user);
    });
}));

Or, if you decide later that you need the req in your LocalStrategy, then add the parameter to the function, like this: 或者,如果您稍后决定在LocalStrategy中需要该req ,则将参数添加到函数中,如下所示:

passport.use(new LocalStrategy({

    passReqToCallback : true
},

function(req, username, password, done) {

    User.findOne({ username: username }, function(err, user) {
        if (err) { return done(err); }
        if (!user) {
            return done(null, false, { message: 'Incorrect username.' });
        }
        if (!user.validPassword(password)) {
            return done(null, false, { message: 'Incorrect password.' });
        }
        return done(null, user);
    });
}
));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM