繁体   English   中英

Node.js - 不是函数

[英]Node.js - Is not a function

我在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不是Query的函数。 (C:\\用户*** \\文件\\ GitHub的\\查询\\配置\\ 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>

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参数)

这也解释了为什么这些领域似乎被转移了。

暂无
暂无

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

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