Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
shiqikai opened this issue Aug 18, 2019 · 6 comments
Open

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

shiqikai opened this issue Aug 18, 2019 · 6 comments

Comments

@shiqikai
Copy link

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

@lfb
Copy link
Owner

lfb commented Aug 18, 2019

看着楼主大神的不断进步,很是崇拜,也一直在跟着你的项目一直在学习。
注意到好像重构了,跟之前的代码完全不一样了。
现在疑惑的地方有三个,大神能给我讲讲吗?
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参数验证器,也应该很多这种介绍,原理就是封装查询传入的参数是否存在,可以在原型链上面一层一层查询是否查询得到。

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

@shiqikai
Copy link
Author

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

@lfb
Copy link
Owner

lfb commented Aug 19, 2019

非常详细,谢谢梁大神!
还有最后一个小问题,让我很疑惑(后来才看到的,可能要再麻烦您花费一点时间写一下,真是不好意思)
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的中间件原理会更加理解,如果有什么问题再问我吧,加油:)

@shiqikai
Copy link
Author

shiqikai commented Aug 19, 2019

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

@lfb
Copy link
Owner

lfb commented Aug 20, 2019

也就是说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控制好异步:)

@shiqikai
Copy link
Author

shiqikai commented Sep 4, 2019

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants