sveltejs / sapper

The next small thing in web development, powered by Svelte
https://sapper.svelte.dev
MIT License
6.99k stars 433 forks source link

sapper.middleware catches all server errors, would rather pass through #993

Open briancray opened 4 years ago

briancray commented 4 years ago

Is your feature request related to a problem? Please describe. I have a error handler in my express app that sends server errors to Sentry and does some custom error handling. Sapper's error handler catches all server errors and doesn't pass them through to my default.

Describe the solution you'd like To pass through sapper server route errors to pass through to my error handling middleware

Describe alternatives you've considered None

How important is this feature to you? Error handling is muy importante

Additional context No extra context

ghost commented 4 years ago

Would be a nice feature!

koenkivits commented 4 years ago

This feels like a must-have. Commenting on this issue to link #812, which is also about error handling and also contains a PR.

Either solution would work for me; I just want (Sentry) error logging to work.

soullivaneuh commented 3 years ago

Is there any alternative to catch Sentry errors?

Trying to use the sentry error handler before the middleware:

import sirv from 'sirv';
import polka from 'polka';
import compression from 'compression';
// eslint-disable-next-line import/no-unresolved
import * as sapper from '@sapper/server';
import * as Sentry from "@sentry/node";

if (process.env.SENTRY_DSN) {
  console.log('sentry init', process.env.SENTRY_DSN);
  Sentry.init({
    dsn: process.env.SENTRY_DSN,
  });
}

const { PORT, NODE_ENV } = process.env;
const dev = NODE_ENV === 'development';

polka() // You can also use Express
  .use(
    Sentry.Handlers.requestHandler(),
    compression({ threshold: 0 }),
    sirv('static', { dev }),
    Sentry.Handlers.errorHandler(),
    sapper.middleware(),
  )
  .listen(PORT, (err) => {
    // eslint-disable-next-line no-console
    if (err) console.log('error', err);
  });

But this to anonymous weird errors.

If no workaround is available, then yes, the feature is quite a must have.

bamadesigner commented 3 years ago

I came up with a simple fix for anyone who is interested/needs something to hold you over until SvelteKit.

I added the status code to the response sent during handle_page(), so when its passed back through middleware you can check response.statusCode inside the middleware function, e.g. if (500 === response.statusCode) equals true when a 500 error has been thrown.

I decided to fork sapper for myself since they might not do any more work here anyway. This is the only change I've made to my fork. Feel free to copy.

https://github.com/bamadesigner/sapper/pull/1/files

vish01 commented 3 years ago

@bamadesigner How can I check responseCode inside sapper.middleware() function? Can you show me an example? And this can go within server.js, correct?

bamadesigner commented 3 years ago

@vish01 It goes inside the sapper middleware, as per these docs: https://sapper.svelte.dev/docs#Seeding_session_data

Here is a modification of their example:

// src/server.js
polka()
    .use(
        // ...
        sapper.middleware({
            // customize the session
            session: ((req, res) => {

                // My sapper fork makes sure this statusCode is defined.
                if (500 === response.statusCode) {
                    return undefined;
                }

                return {
                    user: req.user
                }
            })
        })
    )
vish01 commented 3 years ago

@bamadesigner Just tried that, for any server error, I get 200 as statusCode in the response. image

bamadesigner commented 3 years ago

@vish01 And you're using my sapper fork? or you modified sapper core in the same way I modified my fork? https://github.com/bamadesigner/sapper/pull/1/files

vish01 commented 3 years ago

@bamadesigner I modified sapper code the same way you did. I had to restart the server, but now it works. Thanks for your help! :)