2016-05-14 88 views
1

我在Node.js.中寫了一個登錄。它曾經工作得很好,但現在我試圖添加一個領域,它停止工作,我不知道爲什麼。我使用Passport.js進行身份驗證。Node.js - 不是函數

奇怪的部分是它確實將用戶添加到數據庫,但它切換了字段。名稱是密碼等。

我收到的錯誤如下;

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

TypeError: done is not a function at Query. (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); 
      }); 

     })); 

登錄模型

​​3210

路線

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> 

回答

0

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參數)

這也解釋了爲什麼領域似乎是移動。

+0

ReferenceError:name未在第38行定義。它在newUser.local.name = name中使用name變量;線。 –

+0

'LocalStrategy'適用於兩個字段:'username'和'password'。你可以選擇使用電子郵件地址而不是用戶名,這就是你所做的,但你不能同時擁有。所以你將不得不解決這個問題。既然你傳遞'req',你可以使用'req.body.name'來代替。 – robertklep

+0

我試圖做的事情是使用用戶名和密碼進行驗證,但我在視圖中添加了一個額外的字段,以便用戶可以填寫他們的名字。這樣我可以在登錄頁面上顯示該名稱。所以我只是試圖將額外的字段添加到數據庫中。護照不是這樣嗎?如果沒有,我可以顯示電子郵件。 –