onerror插件的配置中支持errorPageUrl属性,当配置了errorPageUrl时,一旦用户请求线上应用的HTML页面异常,就会重定向到这个地址。
// config/config.default.js
module.exports = {
onerror: {
// 线上页面发生异常时,重定向到这个页面上
errorPageUrl: '/50x.html',
},
};
可以自定义统一异常处理。
// config/config.default.js
module.exports = {
onerror: {
all(err, ctx) {
// 在此处定义针对所有响应类型的错误处理方法
// 注意,定义了 config.all 之后,其他错误处理方法不会再生效
ctx.body = 'error';
ctx.status = 500;
},
html(err, ctx) {
// html hander
ctx.body = 'error
';
ctx.status = 500;
},
json(err, ctx) {
// json hander
ctx.body = { message: 'error' };
ctx.status = 500;
},
jsonp(err, ctx) {
// 一般来说,不需要特殊针对 jsonp 进行错误定义,jsonp 的错误处理会自动调用 json 错误处理,并包装成 jsonp 的响应格式
},
},
};
框架不会将服务端返回的404状态当做异常来处理,但是框架提供了当响应为404且没有返回body时的默认响应,可以将默认的HTML请求的404相应重定向到指定的页面。
// config/config.default.js
module.exports = {
notfound: {
pageUrl: '/404.html',
},
};
自定义404相应,加入一个中间件对404做统一处理。
// app/middleware/notfound_handler.js
module.exports = () => {
return async function notFoundHandler(ctx, next) {
await next();
if (ctx.status === 404 && !ctx.body) {
if (ctx.acceptJSON) {
ctx.body = { error: 'Not Found' };
} else {
ctx.body = 'Page Not Found
';
}
}
};
};
框架本身对web端常见的安全风险内置了相应的解决方案:
Passport是一个扩展性较强的认证中间件,egg在其上提供了egg-passport插件,封装掉了初始化,鉴权成功后的回调处理等通用逻辑。
Passport的执行时序如下:
渲染页面:
框架在Context上提供了接口
ctx.app.locals = { appName: 'showcase' };
const data = { name: 'egg' };
// 自动合并data到ctx.locals
await ctx.renderString('{{ name }} - {{ appName }}', data);
// helper, ctx, request will auto inject
await ctx.renderString('{{ name }} - {{ helper.lowercaseFirst(ctx.app.config.baseDir) }}', data);