Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js-不是一个函数_Javascript_Node.js_Mongodb - Fatal编程技术网

Javascript Node.js-不是一个函数

Javascript Node.js-不是一个函数,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我正在Node.js中编写一个登录名。它过去工作得很好,但现在我试图添加一个字段,但它停止了工作,我不知道为什么。我正在使用Passport.js进行身份验证 奇怪的是,它确实会将用户添加到数据库中,但会切换字段。姓名、密码等 我得到的错误如下 C:\Users***\Documents\GitHub\Query\config\passport.js:33 返回完成(null、false、req.flash('signupMessage','Je email bestaat al'); ^ Ty

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

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

我得到的错误如下

C:\Users***\Documents\GitHub\Query\config\passport.js:33 返回完成(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>

登记员

本地策略的验证回调签名不正确:

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:第38行没有定义名称。它使用newUser.local.name=name中的name变量;行。
LocalStrategy
使用两个字段:
username
password
。您可以选择使用电子邮件地址而不是用户名,这是您所做的,但不能同时使用这两个地址。所以你必须解决这个问题;由于您正在传入
req
,您可能可以使用
req.body.name
来代替。我尝试使用用户名和密码进行身份验证,但我在视图中添加了一个额外字段,以便用户可以填写他们的姓名。这样我就可以在loggedin页面上显示名称。所以我只是在尝试向数据库中添加额外的字段。护照不可能吗?如果没有,我可以显示电子邮件。对于Passport的LocalStrategy,您只能定义两个用于登录的字段,因此您需要选择是
e-mail/password
还是
username/password
。您在策略选项中定义的字段。但是,在将新用户保存到数据库时,您可以通过
req.body
访问表单中的任何其他字段。