(四)egg-核心功能

(四)egg-核心功能

    • (1)异常处理
    • (2)安全
    • (3)鉴权
    • (4)view模板渲染

(1)异常处理

  • 异常捕获
    框架支持的异步编程模型,错误可以使用try catch来捕获。所有的地方均可直接用try catch来捕获异常。

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

'
; } } }; };

(2)安全

框架本身对web端常见的安全风险内置了相应的解决方案:

  • 利用 extend 机制扩展了 Helper API, 提供了各种模板过滤函数,防止钓鱼或 XSS 攻击。
  • 常见 Web 安全头的支持。
  • CSRF 的防御方案。
  • 灵活的安全配置,可以匹配不同的请求 url 。
  • 可定制的白名单,用于安全跳转和 url 过滤。
  • 各种模板相关的工具函数做预处理。

(3)鉴权

Passport是一个扩展性较强的认证中间件,egg在其上提供了egg-passport插件,封装掉了初始化,鉴权成功后的回调处理等通用逻辑。
Passport的执行时序如下:

  • 用户访问页面
  • 检查session
  • 拦截跳鉴权登录页面
  • Strategy鉴权
  • 校验和存储用户信息
  • 序列化用户信息到session
  • 跳转到指定页面

(4)view模板渲染

渲染页面:
框架在Context上提供了接口

  • render(name, locals)渲染模板文件,并赋值给ctx.body
  • renderView(name,locals)渲染模板文件,仅返回,不赋值。
  • renderString(tpl, locals)渲染模板字符串,仅返回不赋值。
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);

你可能感兴趣的:(nodejs)