课程名称: Node.js+Express+Koa2+开发Web Server博客
课程章节: 第6章 博客项目之登录
课程讲师: 双越
(1)express中间件是异步回调,koa2原生支持async/await(而express不支持)。
(2)新开发的框架和系统,都基于koa2,例如:egg.js。
(3)express虽然未过时,但是koa2肯定是未来趋势。
Egg.js 是什么? - 为企业级框架和应用而生
https://eggjs.org/zh-cn/intro/
async/await语法介绍,安装和使用koa2。
开发接口,连接数据库,实现登录,日志记录。
分析koa2中间件原理。
1、await后面可以追加promise对象,获取resolve的值。
2、await必须包裹在async函数里面。
3、async函数执行返回的也是一个promise对象。
4、try-catch截获promise中的reject。
全局安装:npm i koa-generator -g
创建脚手架:koa2 blog-koa2(之后再进入文件夹中,再npm i安装)
使用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
/bin/www:启动server的文件,在里面可以修改端口号
/public:与前端相关的静态文件
/routes/index.js:路由配置文件
/views:前端的模板
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