Search code examples
expressmiddleware

Possible to add an `app` method through middleware in Express?


I am trying to write a middleware that creates a new method on app created with express(). For example, I would like to achieve the following:

app.use(myMiddleware())
// ...
app.newMethod() // added through the previous middleware

Is there a way to achieve this? A way I have thought of, as referenced in some other questions, is to pass in app itself as a param to my middleware so that I could tweak it:

app.use(myMiddleware(app))
// ...
app.newMethod() // ok, definitely doable

However, this does not seem elegant enough.
Also, req.app and res.app references won't work for me in this case, since the (req, res, next) => {} function returned by myMiddleware() only executes when receiving requests, while I possibly want to access the method before even app.listen() is called.

Is there a way I can achieve this?


Solution

  • It really doesn't make sense to add an app method in middleware. The purpose of middleware is to process an incoming request, either in preparation for later middleware or later request handlers or to just handle the request itself in the middleware.

    Middleware gets called over and over during incoming requests. It should never be used for something that should just happen once and it should only be used for processing related to an incoming request.

    while I possibly want to access the method before even app.listen() is called

    So, that definitely has nothing to do with an incoming request then so using middleware is just not the right design choice.

    If all you're trying to do is to add your own method to the app object, you can do that when you are initializing your server:

    const app = require('express')();
    
    // add my own method to the app object
    app.myMethod = function(myArg1, myArg2)  {
        // put the implementation here
    }
    
    app.use(...);
    app.get(...);
    app.get(...);
    
    app.listen(...);
    

    Then, anywhere you want, you can call app.myMethod(...).