/layout/error.vue 自定义。这里会遇到一个问题,
context.error 的参数必须是类似
{ statusCode: 500, message: '服务器开小差了~' } ,
statusCode 必须是http状态码, 而我们服务端返回的错误往往有一些其他的自定义代码,如
{resultCode: 10005, resultInfo: '服务器内部错误' } ,此时需要对返回的api错误进行转换一下。为了方便,我引入了
/plugins/ctx-inject.js 为context注册一个全局的错误处理方法:
context.$errorHandler(err) 。注入方法可以参考: 注入 $root 和 context ,
ctx-inject.js :
// 为context注册全局的错误处理事件
export default (ctx, inject) => {
ctx.$errorHandler = err => {
try {
const res = err.data
if (res) {
// 由于nuxt的错误页面只能识别http的状态码,因此statusCode统一传500,表示服务器异常。
ctx.error({ statusCode: 500, message: res.resultInfo })
} else {
ctx.error({ statusCode: 500, message: '服务器开小差了~' })
}
} catch {
ctx.error({ statusCode: 500, message: '服务器开小差了~' })
}
}
}然后在
nuxt.config.js 使用该插件:
export default {
plugins: [
'~/plugins/ctx-inject.js'
]}注入完毕,我们就可以在
asyncData 介个样子使用了:
export default {
async asyncData (ctx) {
// 尽量使用try catch的写法,将所有异常都捕捉到
try {
throw new Error()
} catch(err) {
ctx.$errorHandler(err)
}
}
}ajax请求出错
对于ajax的异常,此时页面已经渲染,出现错误时不必跳转到错误页,可以通过
this.$toast.error(res.message) toast出来即可。loading方法
nuxt内置了页面顶部loading进度条的样式 推荐使用,提供页面跳转体验。 打开:
this.$nuxt.$loading.start() 完成:
this.$nuxt.$loading.finish()打包部署
一般来说,部署前可以先在本地打包,本地跑一下确认无误后再上传到服务器部署。命令:
// 打包
npm run build










