2015-10-20 65 views
3

我試圖建立與多個控制器綁定快遞路線,當然他們應該接收功能,這就是我想:快速路由器的多個處理程序發出

authRouter.get('/login/redirect/:provider', controllers.handleOAuth2Redirect, controllers.jwt); 

這有時工作,有時不,唯一的變化時作品或不是最小的代碼的變化,可以是一個require線,表達式等

這被拋出的錯誤:

Error: Route.get() requires callback functions but got a [object Object] 

所以下面的代碼是完整的工作控制器文件:

'use strict'; 

var passport = require('passport'); 
var FacebookStrategy = require('passport-facebook').Strategy; 
var TwitterStrategy = require('passport-twitter').Strategy; 
var InstagramStrategy = require('passport-instagram').Strategy; 
var OAuth2Strategy = require('passport-oauth2').Strategy; 
var facebook_scope = ['email', 'user_about_me','user_friends','publish_actions']; 
var passportFacebookOptions = {scope: facebook_scope}; 

passport.use(new FacebookStrategy({ 
    clientID: process.env.FACEBOOK_FINALCUT_APP_ID, 
    clientSecret: process.env.FACEBOOK_FINALCUT_APP_SECRET, 
    callbackURL: 'http://localhost:9248/auth/login/redirect/fb' 
    }, 
    function (accessToken, refreshToken, params, profile, done) { 
     return done(null, profile, params); 
})); 

passport.use(new InstagramStrategy({ 
    clientID: process.env.INSTAGRAM_FINALCUT_CLIENT_ID, 
    clientSecret: process.env.INSTAGRAM_FINALCUT_CLIENT_SECRET, 
    callbackURL: 'http://localhost:9248/auth/login/redirect/ig' 
    }, 
    function (accessToken,refreshToken,profile,done) { 
     return done(null, profile, {tokens: {accessToken: accessToken, refreshToken: refreshToken}});  
    })); 

function oauth2ProviderLogin (request,response,next) { 

    var provider = request.query.provider; 
    switch (provider) { 
     case 'fb': 
      passport.authenticate('facebook')(request,response,next); 
      break; 

     case 'ig': 
      passport.authenticate('instagram')(request,response,next); 
      break; 
    } 
} 

function handleOAuth2Redirect (request,response,next) { 

    var provider = request.params.provider; 

    switch (provider) { 
     case 'fb': 
      passport.authenticate('facebook', {session:false})(request,response,next); 
      break; 

     case 'ig': 
      passport.authenticate('instagram', {session:false})(request,response,next); 
      break; 
    } 
} 

function jwt (request,response,next) { 
    var jwt = require('jsonwebtoken'); 
    var token = jwt.sign({auth: request.authInfo}, '623145ca-7749-11e5-8bcf-feff819cdc9f'); 
    return response.send({user: request.user, auth: token}); 
} 

module.exports = (function() { 

    var authController = { 
     oauth2ProviderLogin: oauth2ProviderLogin, 
     handleOAuth2Redirect: handleOAuth2Redirect, 
     jwt: jwt 
    }; 

    return authController; 
})(); 

我從字面上使它通過改變控制器功能的某些行工作。但出口區塊一直保持不變。自然,我必須保持編碼,但它停止工作。

使其停止工作的一些例子:

'use strict'; 

var passport = require('passport'); 
var jwt = require('jsonwebtoken'); // This makes it fail 
var FacebookStrategy = require('passport-facebook').Strategy; 
var TwitterStrategy = require('passport-twitter').Strategy; 
var InstagramStrategy = require('passport-instagram').Strategy; 
var OAuth2Strategy = require('passport-oauth2').Strategy; 

就是這樣:添加var jwt = require('jsonwebtoken')將使其失敗。

有什麼我失蹤了嗎?

回答

1

我的錯誤實際上是愚蠢的:

添加var jwt = require('jsonwebtoken')因爲我有以下相同名稱的功能:

function jwt (request,response,next) { 
    var token = jwt.sign({auth: request.authInfo}, '623145ca-7749-11e5-8bcf-feff819cdc9f'); 
    return response.send({user: request.user, auth: token}); 
} 

只是改變任何這些名稱將解決這個問題。