make jade.min.js
默认情况下,为了方便调试Jade会把模板组织成带有形如 __.lineno = 3 的行号的形式。 在浏览器里使用的时候,你可以通过传递一个选项 { compileDebug: false } 来去掉这个。
使用中间件统一处理错误有了上面的说明,那现在我们就来看看在 koa 里面怎么优雅的实现统一错误处理。
答案就是使用强大的中间件!
我们可以在业务逻辑中间件(一般就是 MVC 中的 Controller)开始之前定义下面的中间件:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
app.use(function* (next) {
try {
yield* next
} catch(e) {
let status = e.status || 500
let message = e.message || '服务器错误'
if (e instanceof JsonError) { // 错误是 json 错误
this.body = {
'status': status,
'message': message
}
if (status == 500) {
// 触发 koa 统一错误事件,可以打印出详细的错误堆栈 log
this.app.emit('error', e, this)
}
return
}
this.status = status
// 根据 status 渲染不同的页面
if (status == 403) {
this.body = yield this.render('403.html', {'err': e})
}
if (status == 404) {
this.body = yield this.render('404.html', {'err': e})
}
if (status == 500) {
this.body = yield this.render('500.html', {'err': e})
// 触发 koa 统一错误事件,可以打印出详细的错误堆栈 log
this.app.emit('error', e, this)
}
}
})
可以看到,我们直接执行 yield* next,然后 catch 执行过程中任何一个中间件的错误,然后根据错误的“特性”,分别进行不同的处理。
有了这个中间件,我们的业务逻辑 controller 中的代码就可以这样来触发错误:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
const router = new (require('koa-router'))
router.get('/some_page', function* () {
// 直接抛出错误,被中间件捕获后当成 500 错误
throw new PageError('发生了一个致命错误')
throw new JsonError('发送了一个致命错误')
// 带 status 的错误,被中间件捕获后特殊处理
this.throw(403, new PageError('没有权限访问'))
this.throw(403, new JsonError('没有权限访问'))
})
对 Error 分类
上面的代码里面出现的 JsonError、PageError,实际上是继承于 Error 的两个构造器。代码如下:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const util = require('util')
exports.JsonError = JsonError
exports.PageError = PageError
function JsonError(message) {
Error.call(this, message)
}
util.inherits(JsonError, Error)
function PageError(message) {
Error.call(this, message)
}
util.inherits(PageError, Error)
通过继承 Error 构造器,我们可以将错误进行细分,从而能更精细的对错误进行处理。
前后端分离,前端nodejs运行环境,使用koa2集成负责资源分配与用户交互,实现token验证用户身份,路由控制。等!
自行 百度 解决;
"program": "${workspaceFolder}\app.js"
此处就是是将app.js作为启动文件。${workspaceFolder}代表根目录,vsc启动时会在根目录下找到并加载app.js文件。
参数介绍: name 项目名称、 version 版本号、 description 项目描述、 main 项目启动文件、 scripts 启动快捷设置, author 作者, dependencies 第3方中间件名称及版本。
最重要的
“ dependencies ”这里添加一些要用到的包,以上是这次要用到的所有的包,版本自己更改。
“ scripts ”这里是一些nodejs的便捷命令,上线的时候会用到,直接在终端中,package.json同级目录 ,执行‘npm start’ 即 可启动app.js。
别的没啥太大作用瞎写即可。
启动相关配置,封装到config/init.js中,启动文件直接引用即可
3-6-1、init.js项目核心。
异常友好处理方法封装
路由配置
视图渲染
核心集成
3-6-2、config.js项目参数配置。为什么不用json文件 因为json不能加注释
3-6-3、token.js项目token相关方法封装。
执行后项目结构会增加两个文件
新增
src/hello.js。
views/index.html
浏览器访问: http://127.0.0.1:3000/koa/login
输入值获取token
获取的token如图:
先不用带token进行访问: http://127.0.0.1:3000/koa/ hello/jiaobaba,被token拦截,返回401
带上token访问: http://127.0.0.1:3000/koa/ hello/jiaobaba
测试页面渲染,及跳转html页面,直接访问 http://127.0.0.1:3000/koa /views
结束!!!!!!
需要源码联系我