【问题标题】:Check if a given middleware is being used检查是否正在使用给定的中间件
【发布时间】:2014-10-10 16:46:09
【问题描述】:

我尝试了官方文档,但我找不到如何检查当前应用程序是否正在使用给定的中间件(即 morgan)。由于我的中间件配置取决于开发/生产情况,我想检查它们在我的 mocha 测试中是否处于活动状态

【问题讨论】:

    标签: express mocha.js middleware


    【解决方案1】:

    Express 不允许这样做非常干净。

    您可以做的最好的事情是查看app._router.stack,特别是函数引用,或者如果这不可能,函数的名称:

    function middlewareExists(app, name) {
        return !!app._router.stack.filter(function (layer) { 
            return layer && layer.handle && layer.handle.name === name; 
        }).length;
    }
    

    所以,我推荐一种稍微不同的方法。如果您可以获得对您希望应用程序use 的中间件函数的引用,您可以存根use 并断言传递的内容。

    (伪代码)

    // server.js 
    
    helperModule.registerMiddleware(app, 'production');
    
    // helperModule.js
    
    var someMiddleware = require('./someMiddleware');
    
    module.exports = exports = {
        registerMiddleware: function (app, env) {
            if (env === 'production')
                app.use(someMiddleware);
        }
    };
    
    // helperModule.test.js
    
    var helperModule = require('./helperModule');
    var someMiddleware = require('./someMiddleware');
    var app = { use: sinon.stub() };
    
    helperModule.registerMiddleware(app, 'production');
    expect(app.use).to.have.been.calledWith(someMiddleware);
    

    希望这有点说明问题。关键是要注入一些东西,这样您就不需要在实际的 express 应用程序本身上进行断言,您只需注入模拟对象并根据这些对象进行断言。

    【讨论】:

    • 注意上面的函数middlewareExists如果还没有添加到应用程序中的中间件会抛出异常。在函数顶部插入一行 if (!app._router) { return false } 可以防止出现此问题。
    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多