nodejs-koa-blog icon indicating copy to clipboard operation
nodejs-koa-blog copied to clipboard

从90多个star一直关注到现在的433个

Open shiqikai opened this issue 5 years ago • 6 comments

看着楼主大神的不断进步,很是崇拜,也一直在跟着你的项目一直在学习。 注意到好像重构了,跟之前的代码完全不一样了。 现在疑惑的地方有三个,大神能给我讲讲吗? 1.require-directory 自动路由加载 这个是体现在哪里? 2.看文档里token需要base64转码了? 之前的token在代码里都是前面加“bearer:”就行 3.关于验证器这块有相关的文章吗?直接看代码的话有点看不懂 多谢!

shiqikai avatar Aug 18 '19 11:08 shiqikai

看着楼主大神的不断进步,很是崇拜,也一直在跟着你的项目一直在学习。 注意到好像重构了,跟之前的代码完全不一样了。 现在疑惑的地方有三个,大神能给我讲讲吗? 1.require-directory 自动路由加载 这个是体现在哪里? 2.看文档里token需要base64转码了? 之前的token在代码里都是前面加“bearer:”就行 3.关于验证器这块有相关的文章吗?直接看代码的话有点看不懂 多谢!

Hello,谢谢您的关注和支持。是的,这个重构了,变得更加可维护性了,我现在回答一下你的问题:

  1. require-directory 自动路由加载 这个是体现在哪里?

简单说明一下:就是模块化的一个体验,利用代码自动加载进来了,在app.js里面有一段:

// app.js
const InitManager = require('./core/init')

// 然后再init.js里面做的工作就是初始化一些项目配置,正如自动加载路由:
// 加载全部路由
static initLoadRouters() {
    // 绝对路径
    const apiDirectory = `${process.cwd()}/app/api`
    // 路由自动加载
    requireDirectory(module, apiDirectory, {
        visit: whenLoadModule
    })

    // 判断 requireDirectory 加载的模块是否为路由
    function whenLoadModule(obj) {
        if (obj instanceof Router) {
            InitManager.app.use(obj.routes())
        }
    }
}

// 上面的代码就是写了一段代码自动引入文件注册的意思
  1. 看文档里token需要base64转码了?

这个是HTTP Basic auth认证:代码链接,看文件里面的代码:

Util.ajax.interceptors.request.use(config => {
  // 这里
  config.headers['Authorization'] = _encode();
  return config

}, error => {
  return Promise.reject(error)

})

// 转码token
function _encode() {
  const token = Vue.ls.get("token");
  const base64 = Base64.encode(token + ':');
  return 'Basic ' + base64
}
// 至于:之前的token在代码里都是前面加“bearer:”就行,之前的验证是Bear Token,现在是Basic auth认证
  1. 关于验证器这块有相关的文章吗?

复习一下原型链,看下源码:链接

你百度Google搜下JS验证器,koa2参数验证器,也应该很多这种介绍,原理就是封装查询传入的参数是否存在,可以在原型链上面一层一层查询是否查询得到。

简单回答了一下,如果有什么问题再问我吧,加油:)

看着楼主大神的不断进步,很是崇拜,也一直在跟着你的项目一直在学习。 注意到好像重构了,跟之前的代码完全不一样了。 现在疑惑的地方有三个,大神能给我讲讲吗? 1.require-directory 自动路由加载 这个是体现在哪里? 2.看文档里token需要base64转码了? 之前的token在代码里都是前面加“bearer:”就行 3.关于验证器这块有相关的文章吗?直接看代码的话有点看不懂 多谢!

Hello,谢谢您的关注和支持。是的,这个重构了,变得更加可维护性了,我现在回答一下你的问题:

  1. require-directory 自动路由加载 这个是体现在哪里?

简单说明一下:就是模块化的一个体验,利用代码自动加载进来了,在app.js里面有一段:

// app.js
const InitManager = require('./core/init')

// 然后再init.js里面做的工作就是初始化一些项目配置,正如自动加载路由:
// 加载全部路由
static initLoadRouters() {
    // 绝对路径
    const apiDirectory = `${process.cwd()}/app/api`
    // 路由自动加载
    requireDirectory(module, apiDirectory, {
        visit: whenLoadModule
    })

    // 判断 requireDirectory 加载的模块是否为路由
    function whenLoadModule(obj) {
        if (obj instanceof Router) {
            InitManager.app.use(obj.routes())
        }
    }
}

// 上面的代码就是写了一段代码自动引入文件注册的意思
  1. 看文档里token需要base64转码了?

这个是HTTP Basic auth认证:代码链接,看文件里面的代码:

Util.ajax.interceptors.request.use(config => {
  // 这里
  config.headers['Authorization'] = _encode();
  return config

}, error => {
  return Promise.reject(error)

})

// 转码token
function _encode() {
  const token = Vue.ls.get("token");
  const base64 = Base64.encode(token + ':');
  return 'Basic ' + base64
}
// 至于:之前的token在代码里都是前面加“bearer:”就行,之前的验证是Bear Token,现在是Basic auth认证

img

  1. 关于验证器这块有相关的文章吗?

复习一下原型链,看下源码:链接

你百度Google搜下JS验证器,koa2参数验证器,也应该很多这种介绍,原理就是封装查询传入的参数是否存在,可以在原型链上面一层一层查询是否查询得到。

简单回答了一下,如果有什么问题再问我吧,加油:)

lfb avatar Aug 18 '19 13:08 lfb

非常详细,谢谢梁大神! 还有最后一个小问题,让我很疑惑(后来才看到的,可能要再麻烦您花费一点时间写一下,真是不好意思) image 就是里面的new Auth(AUTH_ADMIN).m 我知道是一定要权限大于等于admin的意思才能通过这个接口的权限校验的意思,但是router原来的的方法定义是router.delete('/article/:id', async (ctx),为什么中间加了一个new Auth(AUTH_ADMIN).m 方法依然能够成功使用并且加了这个之后就能做到权限校验呢? 麻烦了!

shiqikai avatar Aug 19 '19 00:08 shiqikai

非常详细,谢谢梁大神! 还有最后一个小问题,让我很疑惑(后来才看到的,可能要再麻烦您花费一点时间写一下,真是不好意思) image 就是里面的new Auth(AUTH_ADMIN).m 我知道是一定要权限大于等于admin的意思才能通过这个接口的权限校验的意思,但是router原来的的方法定义是router.delete('/article/:id', async (ctx),为什么中间加了一个new Auth(AUTH_ADMIN).m 方法依然能够成功使用并且加了这个之后就能做到权限校验呢? 麻烦了!

简单来说,new Auth(AUTH_ADMIN).m也是一个中间件,这个中间件做的事情是控制权限,你可以在【链接】这里看代码理解一下,原理就是登陆后下发的token就包含了权限的级数,然后如果需要判断权限的,就在这个中间件里面判断,最后得出判断的结果是否通过。记住,koa2都是基于洋葱模型应用的,去学习关于koa2的中间件原理会更加理解,如果有什么问题再问我吧,加油:)

lfb avatar Aug 19 '19 07:08 lfb

也就是说router.get、router.post等方法的参数({path},A, B, C, async(ctx) )中间的 A,B,C也会被当做中间件添加吗?:) 因为以前都是router.get({path}, async(ctx))这样直接用的 , 不知道还能这样添加中间件(见笑了) 我印象中添加中间件不都是app.use(某中间件)这样类型的吗?:) 为什么能这样添加呢?

shiqikai avatar Aug 19 '19 07:08 shiqikai

也就是说router.get、router.post等方法的参数({path},A, B, C, async(ctx) )中间的 A,B,C也会被当做中间件添加吗?:) 因为以前都是router.get({path}, async(ctx))这样直接用的 , 不知道还能这样添加中间件(见笑了) 我印象中添加中间件不都是app.use(某中间件)这样类型的吗?:) 为什么能这样添加呢?

是啊,但是有一点注意:要确保洋葱模型的机制,向A,B,C这些中间件需要添加async/await控制好异步:)

lfb avatar Aug 20 '19 07:08 lfb

梁老师, 后期有空的话 可以再加个redis集成不 非常想学!

shiqikai avatar Sep 04 '19 09:09 shiqikai