【问题标题】:Node.js - Is not a functionNode.js - 不是一个函数
【发布时间】:2016-09-10 18:55:10
【问题描述】:

我正在用 Node.js 编写登录信息。它以前工作得很好,但现在我试图添加一个字段,它停止工作,我不知道为什么。我正在使用 Passport.js 进行身份验证。

奇怪的是它确实将用户添加到数据库中,但它会切换字段。名称是密码等。

我得到的错误如下;

C:\Users***\Documents\GitHub\Query\config\passport.js:33 return done(null, false, req.flash('signupMessage', 'Je email bestaat al.')); ^

TypeError: done 不是函数 在查询。 (C:\Users***\Documents\GitHub\Query\config\passport.js:33:28)

passport.js

var LocalStrategy = require('passport-local').Strategy;
var FacebookStrategy = require('passport-facebook').Strategy;
var User = require('../models/login.js');
var configAuth = require('./auth');

module.exports = function (passport) {

    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({
            nameField: 'name',
            usernameField: 'email',
            passwordField: 'password',
            passReqToCallback: true
        },
        function (req, name, email, password, done) {

            User.findOne({
                'local.email': email
            }, function (err, user) {

                if (err)
                    return done(err);
                if (user) {
                    return done(null, false, req.flash('signupMessage', 'Je email bestaat al.'));
                } else {

                    var newUser = new User();

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

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

            });

        }));

    passport.use('local-login', new LocalStrategy({
            usernameField: 'email',
            passwordField: 'password',
            passReqToCallback: true
        },
        function (req, name, email, password, done) {
            User.findOne({
                'local.email': email
            }, function (err, user) {
                if (err)
                    return done(err);
                if (!user)
                    return done(null, false, req.flash('loginMessage', 'De gebruiker bestaat niet. Maak een account!'));
                if (!user.validPassword(password))
                    return done(null, false, req.flash('loginMessage', 'Wachtwoord is verkeerd. Probeer het opnieuw!'));
                return done(null, user);
            });

        }));

登录模式

var mongoose = require('mongoose'); var bcrypt   = require('bcrypt-nodejs');

var userSchema = mongoose.Schema({

    local            : {
        name         : String,
        email        : String,
        password     : String,
    },
    facebook         : {
        id           : String,
        token        : String,
        email        : String,
        name         : String
    } });

userSchema.methods.generateHash = function(password) {
    return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null); };

userSchema.methods.validPassword = function(password) {
    return bcrypt.compareSync(password, this.local.password); };

module.exports = mongoose.model('User', userSchema);

路线

module.exports = function (app, passport) {
    app.get('/', function (req, res) {
        res.render('login.ejs', {
            message: req.flash('loginMessage')
        });
    });

    app.get('/register', function (req, res) {
        res.render('index.ejs', {
            message: req.flash('signupMessage')
        });
    });

    app.post('/', passport.authenticate('local-login', {
        successRedirect: '/topic',
        failureRedirect: '/',
        failureFlash: true
    }));

    app.post('/register', passport.authenticate('local-signup', {
        successRedirect: '/topic',
        failureRedirect: '/register',
        failureFlash: true
    }));

};

构成视图的一部分

 <form action="/register" method="post">
                        <div class="form-group">
                            <input type="text" placeholder="Name" class="form-control nameForm" name="name">
                        </div>
                        <!-- END FORM GROUP -->
                        <div class="form-group">
                            <input type="text" placeholder="Email" class="form-control emailForm" name="email">
                        </div>
                        <!-- END FORM GROUP -->
                        <div class="form-group">
                            <input type="password" placeholder="Password" class="form-control" name="password">
                        </div>
                        <!-- END FORM GRROUP -->
                        <button type="submit" class="btn btn-primary btn-default">Registeer</button>
                    </form>

【问题讨论】:

    标签: javascript node.js mongodb


    【解决方案1】:

    LocalStrategy的验证回调签名不正确:

    passport.use('local-signup', new LocalStrategy({
            nameField: 'name',
            usernameField: 'email',
            passwordField: 'password',
            passReqToCallback: true
        }, function (req, name, email, password, done) { ... })
    

    正确的签名:

    function(req, email, password, done) { ... }
    

    (没有name 参数)

    这也解释了为什么这些字段似乎被转移了。

    【讨论】:

    • ReferenceError: name is not defined on line 38. 它使用了 newUser.local.name=name 中的 name 变量;行。
    • LocalStrategy 使用两个字段:usernamepassword。您可以选择使用电子邮件地址而不是用户名,这就是您所做的,但您不能同时拥有两者。所以你将不得不解决这个问题;由于您传入的是req,因此您可以改用req.body.name
    • 我正在尝试做的事情是使用用户名和密码进行身份验证,但我在视图中创建了一个额外的字段,以便用户可以填写他们的姓名。这样我就可以在登录页面上显示名称。所以我只是尝试将额外的字段添加到数据库中。护照不能这样吗?如果没有,我可以显示电子邮件。
    • 对于 Passport 的 LocalStrategy,您只能定义两个用于登录的字段,因此您需要选择是 e-mail/password 还是 username/password。您在策略选项中定义的那些字段。但是,在将新用户保存到数据库时,您可以通过 req.body 访问表单中的任何其他字段。
    猜你喜欢
    • 2019-03-12
    • 2017-10-25
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2018-10-13
    相关资源
    最近更新 更多