【问题标题】:Access bundled node.js module访问捆绑的 node.js 模块
【发布时间】:2012-06-14 23:50:19
【问题描述】:

我编写了一个基于 express.js 的小型网络应用程序。我提供 manifest.webapp 但 express.js 没有发送正确的 mime 类型。但是因为 express.js 捆绑了 mime 模块 require("mime").define(...) 没有效果。它为错误的模块定义了 MIME 类型!

有没有办法访问与 express.js 捆绑在一起的 mime 模块?或者有没有办法告诉 npm(和 nodejitsu)不要使用 express.js 的捆绑模块?

【问题讨论】:

    标签: node.js express npm


    【解决方案1】:

    我认为有两种方法可以解决此问题。

    使用简单的中间件

    app.get('*.webapp', function (req, res, next) {
      res.header('Content-Type', 'application/x-web-app-manifest+json');
      next();
    });
    

    猴子补丁

    修改响应对象并覆盖setHeader方法,在这里你可以将响应修改为实际值(它将作为一个中间件工作)。

    var mime = require('mime');
    mime.define({ 'application/x-web-app-manifest+json': [ 'webapp' ] });
    
    app.use(function (req, res, next) {
      var setHeader = res.setHeader;
    
      res.setHeader = function (field, val) {
        // you can be more strict here
        if (field === 'Content-Type') {
          val = mime.lookup(req.path);
        }
    
        return setHeader.call(this, field, val);
      }
    
      next();
    });
    app.use(express.static(__dirname + 'your-static-dir'));
    

    因此,您将使用自己的 mime 模块而不是捆绑的。

    更新静态中间件未使用req.contentType 方法。

    【讨论】:

    • 这很老套。真的没有更清洁的解决方案吗?真的没有办法安装不捆绑任何东西的 express 版本吗?或者如果非捆绑版本可用,则不使用捆绑模块?
    • 第二个解决方案是 hack,我知道。但是最简单的方法是第一种解决方案,或者你也可以修改安装的mime模块,但我不建议这样做。
    • 好的,这行得通。不过,这几乎是一个笑话。什么样的 Web 框架不允许您定义一个简单的 mime 类型映射列表? WTF,为什么要捆绑这些模块?它只会破坏一切,对任何事情都没有帮助。
    • 关于猴子补丁不起作用的评论确实指的是您的第一个版本。这不起作用,因为正如您所说,静态不使用 contentType。
    【解决方案2】:

    我发现您可以通过这种方式访问​​捆绑的模块:

    require("express/node_modules/mime").define({
        'application/x-web-app-manifest+json': ['webapp']
    });
    

    我不知道这是否是正确的方法,但我现在使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-15
      • 2011-03-30
      相关资源
      最近更新 更多