课程信息
课程名称: Node.js+Express+Koa2+开发Web Server博客
课程章节: 第6章 博客项目之登录
课程讲师: 双越
课堂笔记
1、Koa2简介
1.基本特点
(1)express中间件是异步回调,koa2原生支持async/await(而express不支持)。
(2)新开发的框架和系统,都基于koa2,例如:egg.js。
(3)express虽然未过时,但是koa2肯定是未来趋势。
Egg.js 是什么? - 为企业级框架和应用而生
https://eggjs.org/zh-cn/intro/
2.课程基本目录
async/await语法介绍,安装和使用koa2。
开发接口,连接数据库,实现登录,日志记录。
分析koa2中间件原理。
3.async await
1、await后面可以追加promise对象,获取resolve的值。
2、await必须包裹在async函数里面。
3、async函数执行返回的也是一个promise对象。
4、try-catch截获promise中的reject。
4.使用脚手架安装
全局安装:npm i koa-generator -g
创建脚手架:koa2 blog-koa2(之后再进入文件夹中,再npm i安装)
5.安装nodemon
使用nodemon监测文件变化,自动重启node。
使用cross-env设置环境变量,兼容mac、linux和windows。
具体操作:
安装nodemon和cross-env:npm i nodemon cross-env --save-dev
在package.json中配置:
“scripts”: {
“start”: “node bin/www”,
“dev”: “cross-env NODE_ENV=dev ./node_modules/.bin/nodemon bin/www”,
“prd”: “cross-env NODE_ENV=production pm2 start bin/www”,
“test”: “echo “Error: no test specified” && exit 1”
},
开启koa2:npm run dev,访问地址:http://localhost:3000
2、文件说明
1.文件夹目录
/bin/www:启动server的文件,在里面可以修改端口号
/public:与前端相关的静态文件
/routes/index.js:路由配置文件
/views:前端的模板
2.app.js文件说明
const Koa = require('koa')
const app = new Koa()
// 对应的是views文件夹
const views = require('koa-views')
// postData中JSON格式处理的
const json = require('koa-json')
// 错误处理
const onerror = require('koa-onerror')
const bodyparser = require('koa-bodyparser')
// 日志处理
const logger = require('koa-logger')
// 路由处理(引入路由)
const index = require('./routes/index')
const users = require('./routes/users')
const blog = require("./routes/blog")
const user = require("./routes/user")
// 错误监测
onerror(app)
// app.use:注册中间件
app.use(bodyparser({
enableTypes:['json', 'form', 'text']
}))
app.use(json())
app.use(logger())
// 下面这两段代码与前端有关
app.use(require('koa-static')(__dirname + '/public'))
app.use(views(__dirname + '/views', {
extension: 'pug'
}))
// logger
app.use(async (ctx, next) => {
const start = new Date()
// next()实质上是一个async函数,返回的是promise对象,写成看似同步的方法
await next()
// 当前请求的耗时
const ms = new Date() - start
console.log(`${ctx.method} ${ctx.url} - ${ms}ms`)
})
// 路由处理(注册路由)
app.use(index.routes(), index.allowedMethods())
app.use(users.routes(), users.allowedMethods())
app.use(blog.routes(), blog.allowedMethods())
app.use(user.routes(), user.allowedMethods())
// 错误处理
app.on('error', (err, ctx) => {
console.error('server error', err, ctx)
});
module.exports = app