【问题标题】:Node - Saving google openid to mongodb节点 - 将 google openid 保存到 mongodb
【发布时间】:2015-01-08 10:31:04
【问题描述】:

我正在使用带有护照的 nodejs,到目前为止,我已经成功地允许用户通过 google openID 使用以下内容登录我的应用程序:

passport.use( new GoogleStrategy({
        returnURL: 'http://localhost:22169/auth/google/return',
        realm: 'http://localhost:22169/'
    },
    function(identifier, profile, done) {
        // async verification
        process.nextTick( function() {
            profile.identifier = identifier;
            return done(null, profile);
        });
    }
));

一旦我完成这项工作,我的下一步就是仅获取 openID 值并使用 mongoose 将其保存到 mongodb 中。这是我认为应该起作用的:

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test'); 

var User = mongoose.model('User', { openId: String });

/*
  Some other stuff...
 */

passport.use( new GoogleStrategy({
        returnURL: 'http://localhost:22169/auth/google/return',
        realm: 'http://localhost:22169/'
    },
    function(identifier, profile, done) {
        User.findOrCreate({ openId: identifier }, function(err, user) {
            done(err, user);
        });
    }
));

但是当我运行节点并尝试通过谷歌登录时,我收到一条错误消息:

/Users/mporter/Sites/budgeter/b-server.js:42
        User.findOrCreate({ openId: identifier }, function(err, user) {
             ^
TypeError: Object function model(doc, fields, skipId) {
    if (!(this instanceof model))
      return new model(doc, fields, skipId);
    Model.call(this, doc, fields, skipId);
  } has no method 'findOrCreate'
    at Strategy.app.configure.app.use.express.session.secret [as _verify] (/Users/mporter/Sites/budgeter/b-server.js:42:14)
    at /Users/mporter/Sites/budgeter/node_modules/passport-google/node_modules/passport-openid/lib/passport-openid/strategy.js:219:16
    at /Users/mporter/Sites/budgeter/node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js:1063:12
    at /Users/mporter/Sites/budgeter/node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js:1203:12
    at /Users/mporter/Sites/budgeter/node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js:1265:7
    at Object.openid.loadAssociation (/Users/mporter/Sites/budgeter/node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js:107:5)
    at _checkSignatureUsingAssociation (/Users/mporter/Sites/budgeter/node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js:1231:10)
    at _checkSignature (/Users/mporter/Sites/budgeter/node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js:1221:5)
    at _verifyAssertionAgainstProvider (/Users/mporter/Sites/budgeter/node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js:1184:3)
    at /Users/mporter/Sites/budgeter/node_modules/passport-google/node_modules/passport-openid/node_modules/openid/openid.js:1155:16

我认为它必须与 User 关键字有关,但我认为我做得正确并创建了一个合适的猫鼬模型。任何人都愿意伸出援助之手。

【问题讨论】:

    标签: node.js mongodb passport.js


    【解决方案1】:

    Passport 需要在您的模型上使用findOrCreate 方法,如上所述,但此方法未内置到猫鼬模型中。试试mongoose findorcreate plugin,它会将 findOrCreate 方法添加到您指定的模型中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-13
      • 2018-06-02
      • 2020-02-18
      • 1970-01-01
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      • 2020-06-22
      相关资源
      最近更新 更多