【发布时间】: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