【问题标题】:passport of nodejs throw pass is not defined (nodejs 0.12.7)nodejs throw pass的passport未定义(nodejs 0.12.7)
【发布时间】:2016-06-16 23:10:51
【问题描述】:

我的应用程序使用passport 为身份验证用户,但它有时会抛出这样的异常:

ReferenceError: pass is not defined at deserialized (node_modules/passport/lib/authenticator.js:345:7) at app/app.js:89:10

app.js 是:

    var app, bodyParser, config, cookies, cors, e, express, http, keys, localStrategy, logger, multipart, passport, path, router, server, session, sessionStore, sessionUsed, session_store, util, uuid;

express = require('express');

http = require('http');

path = require('path');

session = require('express-session');

cors = require('cors');

session_store = require('sessionstore');

keys = require("keygrip")(['a', 'b']);

bodyParser = require('body-parser');

cookies = require('cookies').express;

passport = require('passport');

uuid = require('node-uuid');

multipart = require('connect-multiparty');

localStrategy = require('passport-local').Strategy;

config = require('./config/config');

util = require('./libs/util');

logger = require('./libs/logger');

sessionStore = session_store.createSessionStore(config.getMemCache());

sessionUsed = session({
  secret: config.getCookieSecret(),
  genid: function() {
    return uuid.v4();
  },
  cookie: {},
  saveUninitialized: true,
  resave: true,
  store: sessionStore
});

app = express();

router = express.Router();

app.set('port', process.env.PORT || config.getServerPort());

app.set('views', __dirname + '/../app/public');

app.set('view engine', 'html');

app.use(sessionUsed);

app.use(cors());

app.use(bodyParser.json());

app.use(bodyParser.urlencoded({
  extended: true
}));

app.use(multipart({
  maxFilesSize: 2 * 1024 * 1024
}));

app.use(express["static"](path.join(__dirname, '/../app/public')));

app.use(cookies(keys));

app.use(passport.initialize());

app.use(passport.session());

passport.use('local', new localStrategy({
  passReqToCallback: true
}, util.checkUserPassword));

passport.serializeUser(function(user, done) {
  return done(null, user);
});

passport.deserializeUser(function(user, done) {
  return done(null, user);
});

require('./routes/router')(app, router, passport);

server = http.createServer(app);

try {
  server.listen(app.get('port'), function() {
    return logger.info('Express is running at:' + app.get('port'));
  });
} catch (_error) {
  e = _error;
  console.log(e);
}

我查看了抛出异常的代码,像这样

【问题讨论】:

  • 永远不要发布代码截图。贴出实际代码。
  • 您能否发布整个模块,或者至少发布您导入的部分并(如果适用)修改pass 变量?也请从app.js:89:10 发布代码,更新问题后在此处发表评论。
  • app.js的代码贴出来了,护照版本是v0.2.2,可以npm install passport@0.2.2安装模块,查看完整代码

标签: node.js passport.js


【解决方案1】:

首先,您的错误未显示在屏幕截图中。在屏幕截图中,您将显示来自authenticator.js 的line 282。您的错误消息显示您的问题实际出在哪里-function deserialized 中的line 345

出现此错误的原因是您的 app.js 中的反序列化函数未传递用户对象。您的反序列化函数是序列化函数的副本,它不应该是。两者应该是这样的:

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

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

当然,如果不更改序列化函数以存储user.id 或某个唯一标识符而不是尝试存储整个用户,则不能使用此反序列化函数。我不知道当您尝试序列化整个用户时会发生什么,但我相信这是导致您的问题的原因。

希望有帮助!

【讨论】:

  • 我已按照您的建议编辑了我的代码,但它不能解决我的问题
  • @sundq 如果您使用虚拟数据,它是否有效?尝试将done(null, 100) 放入serializeUser 并将done(null, {"test": "object"}) 放入deserializeUser,而不是User.findByID。如果这不起作用,我建议尝试使用更新版本的护照。
  • 我用的护照是最新版
  • @sundq 你说你的错误是在护照 v0.2.2 中,现在有一个 v0.3.2。另外,您的错误表明该错误是在您的 app.js 中的 89:10 行上触发的,那是哪一行代码?
  • 看起来第 89 行是您的 passport.deserializeUser 函数,所以它仍然表明这是您的问题所在。虚拟数据是否仍然触发错误?
猜你喜欢
  • 1970-01-01
  • 2015-03-24
  • 2021-03-27
  • 2019-08-13
  • 1970-01-01
  • 2017-08-15
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多