【问题标题】:flatiron.js / union - where to put app.use() configuration?flatiron.js / union - 在哪里放置 app.use() 配置?
【发布时间】:2012-04-04 08:41:58
【问题描述】:

从 Union 获取 simple example,我想知道我可以将通常放在 app.configure 中的配置代码放在哪里,例如 passport.js

app.configure(function() {
  // Initialize Passport!  Also use passport.session() middleware, to support
  // persistent login sessions (recommended).
  app.use(passport.initialize());
  app.use(passport.session());
});

有什么想法吗?服务器和路由器不接受 use()。

【问题讨论】:

    标签: javascript node.js flatiron.js nodejitsu


    【解决方案1】:

    Union 似乎为此使用了 before 集合:

    var server = union.createServer({
      before: [
        connect.session({ secret: 'keyboard cat' }), // for `passport.session()`
        passport.initialize(),
        passport.session(),
    
        // etc.
      ]
    });
    

    来自"API" documentation

    @option before {Array} 
        The `before` value is an array of middlewares, which are used to route and serve incoming 
        requests. For instance, in the example, `favicon` is a middleware which handles requests 
        for `/favicon.ico`.
    

    【讨论】:

    • 'before' 被每个请求调用。 app.configure 仅在应用加载时执行一次。所以这不一样(并且会产生很多开销)。
    • @Patrick 这就是基于Connect 的中间件的工作方式——它们必须能够响应每个请求,或者将其传递给下一个中间件。 app.configure 设置相同的场景;它只是选择了一系列app.use 调用(可以选择将它们附加到各种部署模式),而不是一个单一的、恒定的before 数组。这就是为什么挑剔你使用的中间件会有所帮助的原因——每个中间件都会增加一些开销。
    • 嗯,好的。我习惯了 Express 中的场景。我只是想知道,因为 Passport 不起作用,我不知道为什么。
    【解决方案2】:

    Union 支持通过 before 属性连接中间件,正如其他人之前提到的那样。但是,union 不处理应用程序配置;熨斗可以。然而,api 与 express 有很大的不同。

    例如,配置应用程序可能如下所示:

    var path = require('path'),
        flatiron = require('flatiron'),
        app = flatiron.app,
        plugins = flatiron.plugins,
        connect = require('connect'), // most connect middlewares work with flatiron ootb
        passport = require('passport');
    
    // Use flatiron's http plugin (not the same as a middleware!)
    app.use(plugins.http);
    
    // configuration consists of key/value pairs, not of function blocks associated with
    // certain "environments".
    // Here's *a* way you can handle environment-based configs; there are others!
    app.config.file(path.resolve(
      __dirname,
      'config',
      (process.env.NODE_ENV || 'config') + '.json'
    ));
    
    // Use our config to set the secret
    app.http.before.push(connect.session({
      secret: app.config.get('secret') || 'keyboard cat' //default
    }))
    app.http.before.push(passport.initialize());
    app.http.before.push(passport.session());
    

    我没有尝试运行这个示例(我相信这里有更多细节),但希望这能给你一个想法。

    【讨论】:

      【解决方案3】:

      我刚刚构建了一个包装器来集成 Passport.js 和 Flatiron.js。

      https://npmjs.org/package/flatiron-passport

      https://github.com/travist/flatiron-passport

      请阅读 README.md 以了解如何使用它并将其应用于您的应用程序。

      我已经在 LocalStrategy 上对其进行了测试,但它应该适用于其他策略。

      否则请告诉我。

      【讨论】:

      • 感谢您发布您的答案!请务必仔细阅读FAQ on Self-Promotion
      • 除了我为解决这个人关于将 passport.js 与 flatiron.js 集成的问题而编写的免费和开源软件包之外,我没有推广任何其他东西。我还透露是我写的。自我推销指南是否禁止我提供代码链接,或者我应该将其复制并直接粘贴到我的答案中。抱歉...刚刚为 stackoverflow 做贡献,所以不完全确定我是如何违反条款的。
      • 您阅读我发布的链接了吗?免费或开源的东西在这里没有任何意义。我不是说你违反了什么。我强烈建议您阅读并理解。
      猜你喜欢
      • 2019-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-19
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多