安装
yarn add koa
代码
Koa的核心代码就三行
const Koa = require('koa') const app = new Koa() app.use(async (ctx, next) => { ctx.body = 'Hello World!' }) app.listen(8080)
至此一个简单的服务器运行成功。
koa脚手架
npm install -g koa2-generator
koa2 koa-demo
编写一个静态页面
module.exports = ` <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Koa Server HTMl</title> <link href="https://cdn.bootcss.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" rel="stylesheet"> <script src="https://cdn.bootcss.com/jquery/3.2.0/jquery.min.js"></script> <script src="https://cdn.bootcss.com/bootstrap/4.0.0-beta.2/js/bootstrap.bundle.min.js"></script> </head> <body> <div class="container"> <div class="row"> <div class="col-md-8"> <h1>Hi Susan</h1> <p>This is a test</p> </div> <div class="col-md-4"> <p>测试静态 HTML 页面</p> </div> </div> </div> </body> </html> `
const Koa = require('koa') const app = new Koa() const {normal} = require('./tpl/index') app.use(async(ctx, next) => { ctx.type = 'text/html;charset=utf-8;' ctx.body = normal }) app.listen(8080)
编写模板页面
安装pug模板引擎
yarn add pug
动态模板引擎代码
module.exports = ` doctype html html head meta(charset='utf-8') meta(name='viewport=', content='width=device-width, initail-scale=1') title Koa Server Pug link(href='https://cdn.bootcss.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css',rel='stylesheet') script(src='https://cdn.bootcss.com/jquery/3.2.0/jquery.min.js') script(src='https://cdn.bootcss.com/bootstrap/4.0.0-beta.2/js/bootstrap.bundle.min.js') body .container .row .col-md-8 h1 Hi #{ name } p This is a test .col-md-4 p 测试动态PUG模板引擎 `
js代码
const Koa = require('koa') const app = new Koa() const pug = require('pug') const {pugTpl} = require('./tpl/index') app.use(async(ctx, next) => { ctx.type = 'text/html;charset=utf-8;' ctx.body = pug.render(pugTpl, { name: 'Susan' }) }) app.listen(8080)
使用模板引擎中间件,支持ejs,pug
koa-views
pug模板引擎代码
doctype html html head meta(charset='utf-8') meta(name='viewport=', content='width=device-width, initail-scale=1') title Koa Server Pug link(href='https://cdn.bootcss.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css',rel='stylesheet') script(src='https://cdn.bootcss.com/jquery/3.2.0/jquery.min.js') script(src='https://cdn.bootcss.com/bootstrap/4.0.0-beta.2/js/bootstrap.bundle.min.js') body .container .row .col-md-8 h1 Hi #{ name } p This is a test .col-md-4 p 测试动态PUG模板引擎
js代码
const Koa = require('koa') const app = new Koa() const views = require('koa-views') const {resolve} = require('path') app.use(views(resolve(__dirname, './views'), { extension: 'pug' })) app.use(async(ctx, next) => { await ctx.render('index', { name: 'Susan' }) }) app.listen(8080, () => { console.log('http://localhost:8080') })
koa-router
yarn add koa-router
代码
const router = require('koa-router')() router.get('/news', async (ctx, next) => { ctx.body = '路由' }) router.get('/news/:id', async (ctx, next) => { ctx.body = '动态路由' }) app.use(router.routes())
路由分离
代码
const router = require('koa-router')() router.prefix('/user') router.get('/', async ctx => { ctx.body = 'Hello Koa2' }) router.get('/info', async ctx => { ctx.body = 'Hello UserInfo' }) module.exports = router
const user = require('./routes/user') app.use(user.routes()).use(user.allowedMethods())
GET
通过ctx.query/ctx.querystring/ctx.request.query/ctx.request.querystring
代码
router.get('/news', async (ctx, next) => { console.log('ctx.query', ctx.query) console.log('ctx.querystring', ctx.querystring) console.log('ctx.request.query', ctx.request.query) console.log('ctx.request.querystring', ctx.request.querystring) })
curl i http://localhost:3000/news?name='Susan&age=12'
POST
通过koa-body
const koaBody = require('koa-body') app.use(koaBody()) router.post('/doAction', async ctx => { console.log('ctx.request.body', ctx.request.body) })
curl i http://localhost:3000/doAction -d 'name=Susan,age=20'
静态资源
安装koa-static
代码
const server = require('koa-static') app.use(server(resolve(__dirname, './static'))) router.get('/', async ctx => { await ctx.render('index') })
<link href="css/style.css" rel="stylesheet" /> <img src="img/1.jpg"/> <script src="js/index.js"></script>
Cookie
ctx.cookies.set(name, value, [options])
ctx.cookies.get(name)
如何处理中文
使用Buffer转换
// 将中文转换base64字符串 new Buffer(value).toString('base64') // 将base64字符串转换为中文 new Buffer(value, 'base64').toString()
Session
安装koa-session
const session = require('koa-session') app.keys = ['some secret hurr'] const CONFIG = { key: 'koa:sess', maxAge: 86400000, autoCommit: true, overwrite: true, httpOnly: true, signed: true, rolling: false, renew: false } app.use(session(CONFIG, app)) router.get('/', async ctx => { let n = ctx.session.view || 0 ctx.session.view = ++ n ctx.body = n })
Mongodb
https://www.mongodb.com/download-center?jmp=nav#community
操作数据库
http://mongodb.github.io/node-mongodb-native/
安装mongodb
连接数据库,创建集合,插入数据
const MongoClient = require('mongodb').MongoClient const url = 'mongodb://127.0.0.1:27017' // URL const dbName = 'dbs' // 数据库名称 const client = new MongoClient(url) // 创建一个Mongodb Client client.connect(err=>{ // 连接数据库 if (err) return console.log('Connected successfully to server') const db = client.db(dbName) // 插入数据 db.collection('documents').insertMany([ {a:1}, {b:2}, {c:3} ]) db.collection('documents').insertOne( {d:4} ) client.close() })
查找数据
db.collection('documents').find({}) .toArray((err, docs) => { if (err) return console.log(docs) })
更新数据
db.collection('documents') .updateOne({a:1}, {$set: {a: 100}}, (err, res) => { if (err) return console.log(res) }) db.collection('documents') .updateMany({a:1}, {$set: {a: 100}}, (err, res) => { if (err) return console.log(res) })
删除数据
db.collection('documents') .deleteOne({a:10}, (err, res) => { if (err) return console.log(res) })
Robo 3T
Mongoose
https://mongoosejs.com/docs/api.html
连接数据库
首先配置数据库,创建一个dbs的数据库
module.exports = { dbs:'mongodb://127.0.0.1:27017/dbs' }
数据库创建完毕,那么创建model也就是集合,即表
const mongoose = require('mongoose') let personSchema = new mongoose.Schema({ name: String, age: Number }) module.exports = mongoose.model('Person', personSchema)
数据库和表创建完毕,那么开始连接数据库
const mongoose = require('mongoose') const dbConfig = require('./dbs/config')
mongoose.connect(dbConfig.dbs, { useNewUrlParser: true })
此刻数据库连接成功,那么我们开始
添加数据
router.post('/addPerson', async ctx => { const person = new Person({ name: ctx.request.body.name, age: ctx.request.body.age }) let code try { await person.save() code = 0 } catch (error) { code = 1 } ctx.body = { code } })
查询数据
const res = await Person.findOne({name:ctx.request.body.name}) const ress = await Person.find({name: ctx.request.body.name})
更新数据
const result = await Person.where({ name: ctx.request.body.name }).update({ age:ctx.request.body.age })
删除数据
const result = await Person.where({ name: ctx.request.body.name }).remove()
Redis
访问网页服务器端会在客户端设置cookie保存session
每次请求把cookie中session发送到服务器端
服务端用session保存客户端状态
服务器端会把session的值保存到Redis中
浏览器用cookie保存session
而且Redis是一个非常快速的读写数据库
案例:登录校验
安装
https://github.com/MicrosoftArchive/redis/releases
启动Redis
安装koa中间件操作Redis
yarn add koa-generic-session koa-redis
连接Redis
app.keys=['keys','keyskeys'] // session加密处理,随便两个值 app.use(session({ key:'mt', prefix:'mtpr', store: new Redis(), }))
使用session
ctx.session.count++
我们也可以直接对Redis操作
const Store = new Redis().client
const st = await Store.hset('fix', 'name', Math.random())
使用redis-cli.exe查看数据
key *
get
hset
hget