节点js Next不是护照策略错误中的函数

问题描述 投票:0回答:1

似乎无法让登录系统正常工作。我正在使用带有用户信息的json文件,并使用node.js,express和passport。这是我的代码(仅删除相关信息)。

Index.js

const express = require('express')
const path = require('path')
const PORT = process.env.PORT || 5000
const myDB = require('./jDB');
const passport = require('passport')
  , LocalStrategy = require('passport-local').Strategy;
const app = express();
const bodyParser = require('body-parser');

app.use(express.static(path.join(__dirname, 'public')));
app.use(bodyParser());
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(passport.initialize());
app.use(passport.session());

app.get('/success', (req, res) => res.send("Welcome "+req.query.username+"!!"));
app.get('/error', (req, res) => res.send("error logging in"));

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

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

passport.use(new LocalStrategy({

  usernameField: 'username',
  passwordfield : 'password'

},
  function(username, password, done) {
  console.log('I was given ' + username + " and " + password);
  if(myDB.login(username, password)) {
      console.log('Logged in');
      return done(null, user); 
  } else {
      console.log('Failed login');
      return done(null, false);
  }
}));


function myAuth(req, res) {
  passport.authenticate('local', { 
    successRedirect: '/success', 
    failureRedirect: '/error', 
  })(req, res);


}

app.get('/login', (req, res) => res.render('pages/login', { root : __dirname}));

app.post('/login', (req, res) => myAuth(req, res));

app.listen(PORT, () => console.log(`Listening on ${ PORT }`));  

jDB.js

const login = require('./json/users.json');

module.exports = {
    login : function(mUser, mPass) {
        var cryptPass = crypto.createHmac('sha256', mPass).digest('hex');
        for(var exUser in login) {
            console.log(json.stringify(login[exUser]) + " against " + mUser);
            if(login[exUser].username == mUser && login[exUser].password == cryptPass) {
                return true;
            }
        } 
        return false;

    }

和login.ejs的表单部分:

<form action='/login' method='post'>
            <div class="form-group">
              <label for="username">Username</label>
              <input type="text" class="form-control" name="username">
            </div>
            <div class="form-group">
              <label for="pasword">Password</label>
              <input type="password" class="form-control" name="password">
            </div>
            <button type="submit" class="btn btn-primary">Login</button>
          </form>

每当我尝试使用正确的用户名和密码详细信息登录时,都会收到以下错误:

TypeError: next is not a function
    at Strategy.strategy.error (/home/tommy/carrers-week/node_modules/passport/lib/middleware/authenticate.js:356:9)
    at Strategy.authenticate (/home/tommy/carrers-week/node_modules/passport-local/lib/strategy.js:93:17)
    at attempt (/home/tommy/carrers-week/node_modules/passport/lib/middleware/authenticate.js:361:16)
    at authenticate (/home/tommy/carrers-week/node_modules/passport/lib/middleware/authenticate.js:362:7)
    at myAuth (/home/tommy/carrers-week/index.js:195:5)
    at app.post (/home/tommy/carrers-week/index.js:202:34)
    at Layer.handle [as handle_request] (/home/tommy/carrers-week/node_modules/express/lib/router/layer.js:95:5)
    at next (/home/tommy/carrers-week/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/home/tommy/carrers-week/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/home/tommy/carrers-week/node_modules/express/lib/router/layer.js:95:5)

我真的不知道如何解决这个问题,所以提前感谢您的帮助!

javascript node.js express passport.js passport-local
1个回答
1
投票

从错误跟踪中可以看到此应用程序抛出

passport.authenticate

此外,它为next方法感到悲伤。我要做的一件事就是把这个电话放在一个范围内

function next() {
  console.log(arguments)
}

或者只是提供它:

function myAuth(req, res, next) {
  passport.authenticate('local', { 
    successRedirect: '/success', 
    failureRedirect: '/error', 
  })(req, res, next);


}

app.post('/login', (req, res, next) => myAuth(req, res, next));

为了获得更多洞察力,我们可以看一下

护照本地/斑点/主/ LIB / strategy.js:93

try {
    if (self._passReqToCallback) {
      this._verify(req, username, password, verified);
    } else {
      this._verify(username, password, verified);
    }
  } catch (ex) {
    return self.error(ex); //93
  }

护照/斑点/主/ LIB /中间件/ authenticate.js:356

  strategy.error = function(err) {
    if (callback) {
      return callback(err);
    }

    next(err); //356
  };

这是:

没有提供给本地策略的回调将触发next()调用

© www.soinside.com 2019 - 2024. All rights reserved.