2014-01-28 30 views
1

我使用與護照的NodeJS,到目前爲止,我已經成功地能夠允許用戶通過谷歌的OpenID登錄到我的應用程序如下:節點 - 保存谷歌的OpenID的MongoDB

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值並使用貓鼬將其保存到一個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,但我認爲我做得正確,並創建了一個合適的貓鼬模型。任何人都在意伸出援助之手。

回答

1

Passport希望如上所示在您的模型上使用findOrCreate方法,但此方法未嵌入貓鼬模型中。試試mongoose findorcreate plugin,它會將findOrCreate方法添加到您指定的模型中。