【问题标题】:how to catch a server error in sapper (svelte)如何在 sapper (svelte) 中捕获服务器错误
【发布时间】:2020-06-06 01:24:20
【问题描述】:

我正在将我的小网站从 express+handlebars 转换为 express+sapper 项目。

我想捕获服务器端错误(例如,转到 /api/error 时的自愿错误)并使用 sapper _error.svelte 模板呈现它们。

我尝试在没有自定义处理程序的情况下仅抛出错误,但它返回一个只有错误堆栈的丑陋文本页面,并且似乎没有被 sapper 的错误处理程序捕获

所以我添加了自己的错误处理程序,并且可以渲染 HTML(裸露的,还没有 css)但是有没有办法可以使用 sapper _error.svelte 模板?

// ----------------------- src/server.js
import sirv from 'sirv'
import express from 'express'
import compression from 'compression'
import * as sapper from '@sapper/server'

import fatal500 from './middlewares/fatal500'

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

const app = express()

app.use(compression({ threshold: 0 }))
app.use(sirv('static', { dev }))

// the voluntary error thrower --------------------------------
app.get('/api/error', (req, res, next) => {
  const error = new Error('this is a voluntary error')
  error.code = 'VOLUNTARY'
  next(error)
})

app.use(sapper.middleware())

app.use(fatal500) // the custom error handler -----------

app.listen(PORT, err => {
  if (err) console.log('error', err)
})

// ---------------------src/middlewares/fatal500.js

export default function fatal500 (err, req, res, next) {
  if (err.code !== 'VOLUNTARY') console.error(err.stack)

  try {
    res.status(500)
      .type('html')
      .send(
        '<h1>Oooops ... 500 server error</h1>' +
        '<p>It seems the server has encountered an error,<br/>' +
        '   try to <a href=\'/\'> return to the website</a><br/>' +
        '   or to <a href="mailto:mail@mail.mail">send me the stack</a>' +
        '</p>' +
        '<h2>Error Stack :</h2>' +
        '<pre class="code"><code>' +
        err.stack +
        '</code></pre>'
      )
  } catch (e) {
    res.status(500)
      .type('text')
      .send(
        '\n\n' +
        '**************************************\n' +
        'Ooops ... 500\n' +
        'the server encountered an unhandled error,\n\n' +
        'if it is not voluntary (going to /api/error)\n' +
        'please EMAIL ME THE FOLLOWING STACK at\n' +
        'mail@mail.mail\n' +
          '**************************************\n\n' +
        'ORIGINAL ERROR STACK ------------------\n\n' +
        err.stack + '\n\n' +
        'ERROR HANDLING STACK ------------------\n\n' +
        e.stack
      )
  }
}

【问题讨论】:

  • 我也遇到了这个问题。
  • Sapper 的错误处理非常不稳定。我的意思是,您将根据错误发生的方式获得不同的结果 -> 例如,服务器端错误处理通常有效,但在客户端导航时出现错误(99% 正常使用)则不然页面将中断并且不显示错误组件。我认为这只发生在发生未捕获的承诺错误时,但工兵不会捕获自己的错误。不要指望这一切都会得到解决,因为 sapper 由于缺乏人气而实际上已被放弃。
  • Sapper 已进行维护,因为我们正在发布 Svelte Kit,而不是因为缺乏人气。
  • 几天前我读到了关于 svelte kit 的文章,我迫不及待地想看看它会是什么。我对 svelte 非常满意,希望它早日成熟。

标签: error-handling svelte sapper


【解决方案1】:

众所周知,Javascript 很难捕获所有类型的错误。Sapper 也没有对这些错误进行任何显式处理,但是有一个简洁的第三方组件可以实现这一点。

我个人使用的第一种方式是这个库:https://www.npmjs.com/package/@crownframework/svelte-error-boundary

这基本上会在组件的边界处捕获错误(在合理范围内)。它提供了一种附加函数的方法,以便您可以针对该错误执行您喜欢的操作。

我目前正在将其构建到 Svelte 本身中。您可以在 RFC 上反馈https://github.com/sveltejs/rfcs/blob/rfc/error-boundary/text/0000-error-boundary.md

我使用边界的方式是将处理程序附加到sentry - https://sentry.io,这将为您分解和诊断问题,以便您修复它们。看看吧!

【讨论】:

  • 感谢您的提示,我正在重建我的网站,留下工兵以获得更简单的 SPA,但保持苗条。我将在包含此功能的同时添加包。
猜你喜欢
  • 1970-01-01
  • 2019-11-24
  • 2021-04-12
  • 2021-05-18
  • 2021-05-21
  • 2020-10-23
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
相关资源
最近更新 更多