FG
💻 Software🌐 Web & Full-Stack

promises

Fresh3 days ago
Mar 14, 20260 views
Confidence Score95%
95%

Problem

now that promises are going mainstream, i'm trying to think of how to make express more async friendly. an idea is to use promises. - `next()` now returns a promise - if middleware returns a promise, that promise is resolved and propagated up `next()`s [code block] Error handlers are now more koa-like: [code block] Pros: - it should be backwards compatible since you don't have to resolve the promise returned from `next()` - much easier error handling including `throw`ing - solves issues shown in https://github.com/visionmedia/express/issues/2255 - no more `fn.length` checking ~_~ - could probably easily upgrade to es7 async functions Cons: - promises - upgrading middleware and supporting both signatures might be a pain in the ass - probably a lot slower

Error Output

Error handlers are now more koa-like:

Unverified for your environment

Select your OS to check compatibility.

1 Fix

Canonical Fix
Unverified Fix
New Fix – Awaiting Verification

Enhance Express Middleware with Promise Support

Medium Risk

The current Express middleware system does not natively support promises, leading to difficulties in handling asynchronous operations and error management. This results in a less intuitive experience for developers, especially when dealing with asynchronous code and error propagation.

Awaiting Verification

Be the first to verify this fix

  1. 1

    Modify Middleware to Return Promises

    Update the middleware functions to return promises. This allows the `next()` function to handle asynchronous operations more effectively.

    javascript
    app.use(async (req, res, next) => { try { await someAsyncOperation(); next(); } catch (error) { next(error); } });
  2. 2

    Update Next Function to Handle Promises

    Change the implementation of the `next()` function to return a promise. This ensures that if a middleware returns a promise, it is resolved before proceeding to the next middleware.

    javascript
    function next(err) { return new Promise((resolve, reject) => { // existing logic }); }
  3. 3

    Implement Koa-like Error Handling

    Revise the error handling mechanism to allow throwing errors directly within middleware. This will simplify error propagation and make it more intuitive for developers.

    javascript
    app.use(async (req, res, next) => { if (someCondition) throw new Error('Something went wrong'); next(); });
  4. 4

    Test Backward Compatibility

    Ensure that existing middleware functions that do not return promises still work correctly with the new implementation. This will help maintain compatibility with existing codebases.

    javascript
    // Test existing middleware
    app.use((req, res, next) => { next(); });
  5. 5

    Benchmark Performance

    Conduct performance benchmarks to evaluate the impact of the new promise-based implementation on the overall application performance. This will help identify any potential slowdowns.

    javascript
    // Use a benchmarking tool to measure response times before and after changes.

Validation

Confirm that middleware functions can return promises and that error handling works as expected by writing unit tests for various scenarios. Ensure that existing middleware continues to function without modification.

Sign in to verify this fix

Environment

Submitted by

AC

Alex Chen

2450 rep

Tags

expressnode.jsapidiscussenhancement5.x