Eggjs 已经有了中间件、扩展机制,为什么还要插件?

  • 与中间件的关系:中间件更适合处理请求,插件可以处理业务逻辑
  • Eggjs 中插件相当于一个微型应用
  • 插件不包括 router.js 和 controller.js 控制器
    • 插件如果有这两个就有可能与主项目中的配置产生冲突

      简单上手:

      auth:一个验证用户是否登录的插件

这个插件存放位置也讲究
新建一个最外层的 lib 文件夹

插件package
lib/plugin/egg-auth/app/package.json

  1. {
  2. "name": "egg-auth",
  3. "eggPlugin": {
  4. "name": "auth"
  5. }
  6. }

真正插件代码
lib/plugin/egg-auth/app/middleware/auth.js

  1. /* eslint-disable no-unused-vars */
  2. 'use strict';
  3. module.exports = options => {
  4. return async (ctx, next) => {
  5. const url = ctx.request.url;
  6. const user = ctx.session.user;
  7. if (!user) {
  8. ctx.body = {
  9. status: 403,
  10. errMsg: '用户未登录',
  11. };
  12. } else {
  13. await next();
  14. }
  15. };
  16. };

session 中取得 user 元素,判断用户是否登录,如果没登录就返回 403 ,登录了就正常继续

全局插件配置
plugin.js 中 package 属性主要是线上安装的一些依赖包, 如果是本地的需要用 path 属性

plugin.js

  1. const path = require('path');
  2. exports.auth = {
  3. enable: true,
  4. path: path.join(__dirname, '../lib/plugin/egg-auth'),
  5. };

session 扩展 中中间件额外的配置
app.js

  1. app.config.coreMiddleware.push('auth');

将该插件放入 coreMiddleware 数组中,此时如果没有登录,那么每个界面都会显示image.png

但是有些页面是不需要登陆验证的,如主页面、用户页面、登入登出
config.default.js

  1. config.auth = {
  2. exclude: ['/home', '/user', '/login', '/logout'],
  3. };

再回到 auth.js 修改判断条件为

  1. if (
  2. !user &&
  3. !options.exclude.includes(ctx.request.url.split('?')[0])
  4. ) {

.split('?')[0] 是考虑 get 请求的情况,以 ? 隔开并取第一个元素 所得的就是 url


info:获取本机信息插件

对插件进行配置
plugin.js

  1. exports.info = {
  2. enable: true,
  3. path: path.join(__dirname, '../lib/plugin/egg-info'),
  4. };

lib/plugin/egg-info/app/package.json

  1. {
  2. "name": "egg-info",
  3. "eggPlugin": {
  4. "name": "info"
  5. }
  6. }

node.js 获取电脑的基本信息
lib/plugin/egg-info/app/extend/context.js

  1. 'use strict';
  2. const os = require('os');
  3. const cpus = os.cpus().length;
  4. const platform = os.type();
  5. const memory = Math.ceil(os.totalmem() / Math.pow(2, 30)) + 'G';
  6. module.exports = {
  7. get info() {
  8. return {
  9. memory,
  10. platform,
  11. cpus,
  12. url: this.request.url,
  13. };
  14. },
  15. };