Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

pass state around between express middleware in an isomorphic react app

I have an isomorphic react app and I would like to somehow pass state between express middleware.

I have the following express route that handles form submission:

export const createPaymentHandler = async (req: Request, res: Response, next: NextFunction) => {
  const { field } = req.body;

  if (!paymentType) {
    res.locals.syncErrors = { field: 'some error.' };
    next();
    return;
  }

  try {
    const { redirectUrl } = await makeRequest<CreatePaymentRequest, CreatePaymentResponse>({
      body: { paymentType },
      method: HttpMethod.POST
    });

    res.redirect(redirectUrl);
  } catch (err) {
    error(err);

    res.locals.serverError = true;

    next();
  }
};

The next middleware is handling the rendering.

At the moment I am using res.locals, is there a better way or a recognised pattern?

like image 428
dagda1 Avatar asked Aug 15 '18 16:08

dagda1


1 Answers

Because your handler is async, you need to pass the err into next, like so:

next(err);

In order for your middleware to process the error, instead of it being picked up by the default error handler, you need to have four parameters:

app.use((err, req, res, next) => {
  // handle the error
})

It's also worth noting that error handlers need to be specified after other middleware. For your case, it might make sense to use a normal "success" middleware alongside an error handler, rather than combining the two into one middleware.

Finally, keep in mind that passing err as a parameter is specific to error handlers. If you just want to pass some data into your next middleware, you would do that by modifying the req:

req.x = 'some data'
next()

Then, the next middleware's req parameter will have the data you set.


Further reading: https://expressjs.com/en/guide/using-middleware.html#middleware.error-handling

like image 147
Luke Willis Avatar answered Nov 12 '22 04:11

Luke Willis