node.js - Express 路由器多个处理程序问题

标签 node.js express

我正在尝试设置与多个 Controller 绑定(bind)的 Express 路由,当然它们应该接收函数,这就是我正在尝试的:

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

这有时有效,有时无效,唯一的变化是有效或无效的代码更改,可能是 require 行、表达式等。

这是抛出的错误:

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

所以下面的代码是完整的工作 Controller 文件:

'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;
})();

我实际上是通过更改 Controller 函数的某些行使其工作的。但导出 block 一直保持不变。当然,我需要继续编码,但随后它就停止工作了。

一个让它停止工作的例子:

'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') 会使它失败。

有什么我想念的吗?

最佳答案

我的错误其实很愚蠢:

添加 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});
}

只需更改其中任何一个的名称即可解决问题。

关于node.js - Express 路由器多个处理程序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33242445/

相关文章:

javascript - Node.js 如何同步返回 REST Web 服务响应?

node.js - 如何更改 express 的 Handlebars 延长件?

node.js - 如何在 mocha 中使用文件上传进行单元测试

javascript - TypeError : curl. setopt 不是一个函数]

json - 解析 JSON 并在 Angular 中显示数据

Node.js 和 Express Web API 无法在 Azure 上运行

node.js - 如何在 node.js 断开连接期间缓冲 MongoDB 插入?

node.js - 安装移动优先开发套件和迁移帮助的正确 Node js 版本是多少

javascript - Nodejs Express - dynamicHelpers 错误

javascript - 异步函数总是返回 undefined