dbs/models/config/person.js
const mongoose = require('mongoose')
// 创建数据表模型,该文件的名字,即person,就是数据表的名字
// 下面给 person 表声明两个字段name和age
let personSchema = new mongoose.Schema({
name: String,
age: Number
})
// 通过建 model 给 person 赋予增删改查等读写的功能
module.exports = mongoose.model('Person', personSchema)
dbs/config.js
// 配置mongo 地址
module.exports = {
dbs: 'mongodb://127.0.0.1:27017/admin'
}
middleware\koa-pv.js
function pv (ctx) {
global.console.log('当前路由', ctx.path) // 打印当前路由,node中全局不能用window,需要用global代替
}
module.exports = function () {
return async function(ctx, next) {
pv(ctx)
await next() // 每个中间件都必须有这一句,用以执行下一个中间件
}
}
routes\users.js
const router = require('koa-router')()
const Person = require('./../dbs/models/person.js')
router.prefix('/users')
router.get('/', function (ctx, next) {
ctx.body = 'this is a users response!'
})
router.get('/bar', function (ctx, next) {
ctx.body = 'this is a users/bar response'
})
/**
* 一、 增加 内容 向person数据模型中
*
* 可以通过命令行执行:curl -d 'name=cck&age=27' http://localhost:3000/users/addPerson
* 若返回: {
"code": 0
}
证明添加数据成功。
注意: save()方法是model自带的写入数据的方法, 通过实例 person 写入
*/
router.post('/addPerson', async function (ctx) {
// 创建实例
const person = new Person({
name: ctx.request.body.name,
age: ctx.request.body.age
})
let code = 0, // 状态码
msg = ''
try {
await person.save()
code = 0
msg = '创建成功'
} catch(e) {
code = -1
msg = '创建失败'
}
// 返回状态(成功为0, 错误为-1)
ctx.body = {
code,
msg
}
})
/**
* 二、 读取 内容 从person数据模型中
* 命令行中输入:curl -d 'name=cck' http://localhost:3000/users/getPerson
* 返回:{
"code": 0,
"result": {
"_id": "5beb91bcd6e7060ffcca6a46",
"name": "cck",
"age": 27,
"__v": 0
},
"results": [
{
"_id": "5beb91bcd6e7060ffcca6a46",
"name": "cck",
"age": 27,
"__v": 0
}
]
}
*
* 注意: findOne()和find()方法是model自带的读取数据的方法, 注意:这里直接通过模型 Person 写入 !!!
* findOne() 只是找到一条符合条件的内容
* find() 可以找到整个符合条件的集合(数组)
*/
router.post('/getPerson', async function (ctx) {
const result = await Person.findOne({
name: ctx.request.body.name,
age:ctx.request.body.age
})
const results = await Person.find({
name: ctx.request.body.name,
age:ctx.request.body.age
})
if(ctx.request.body.length>0){}
// 这里没有考虑异常,直接返回了结果
ctx.body = {
code: 0,
result,
results
}
})
/**
* 三、 修改 内容 从person数据模型中
* 命令行中输入:curl -d 'name=wy&age=19' http://localhost:3000/users/updatePerson
* 返回:{
"code": 0,
}
*
* 注意: where()和update()方法是model自带的读取数据的方法, 注意:这里直接通过模型 Person 写入 !!!
* where() 找到符合条件的内容
* update() 修改该内容
*/
router.post('/updatePerson', async function (ctx) {
// 找到符合条件的name,并修改其age
const result = await Person.where({
name: ctx.request.body.name
}).update({
age: 13
})
// 这里没有考虑异常,直接返回了结果
ctx.body = {
code: 0
}
})
/**
* 四、 删除 内容 从person数据模型中
*
* 注意: where()和update()方法是model自带的读取数据的方法, 注意:这里直接通过模型 Person 写入 !!!
* where() 找到符合条件的内容
* remove() 删除该内容
*/
router.post('/removePerson', async function (ctx) {
// 找到符合条件的name,并修改其age
const result = await Person.where({
name: ctx.request.body.name
}).remove()
// 这里没有考虑异常,直接返回了结果
ctx.body = {
code: 0
}
})
module.exports = router
app.js
const Koa = require('koa')
const app = new Koa()
const views = require('koa-views')
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 pv = require('./middleware/koa-pv')
app.use(pv())
// error handler
onerror(app)
// middlewares
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: 'ejs'
}))
// logger
app.use(async (ctx, next) => {
const start = new Date()
await next()
const ms = new Date() - start
console.log(`${ctx.method} ${ctx.url} - ${ms}ms`)
})
// routes
app.use(index.routes(), index.allowedMethods())
app.use(users.routes(), users.allowedMethods())
// error-handling
app.on('error', (err, ctx) => {
console.error('server error', err, ctx)
});
/*引入koa-session*/
const session = require('koa-session');
/*配置koa-session*/
app.keys = ['some secret hurr'];
const CONFIG = {
key: 'koa:sess', //cookie key (default is koa:sess)
maxAge: 86400000, // cookie 的过期时间maxAge in ms (default is 1 days)
overwrite: true, //是否可以overwrite (默认default true)
httpOnly: true, //cookie 是否只有服务器端可以访问httpOnly or not (default true)
signed: true, //签名默认true
rolling: false, //在每次请求时强行设置cookie,这将重置cookie 过期时间(默认:false)
renew: true, //当cookie快过期时请求,会重置cookie的过期时间
};
app.use(session(CONFIG, app));
module.exports = app
/*引入koa-session*/
const session = require('koa-session');
/*配置koa-session*/
app.keys = ['some secret hurr'];
const CONFIG = {
key: 'koa:sess', //cookie key (default is koa:sess)
maxAge: 86400000, // cookie 的过期时间maxAge in ms (default is 1 days)
overwrite: true, //是否可以overwrite (默认default true)
httpOnly: true, //cookie 是否只有服务器端可以访问httpOnly or not (default true)
//如果想让浏览器获取的话将httpOnly设置为false
signed: true, //签名默认true
rolling: false, //在每次请求时强行设置cookie,这将重置cookie 过期时间(默认:false)
renew: true, //当cookie快过期时请求,会重置cookie的过期时间
};
app.use(session(CONFIG, app));
结语:可以直接设置cookie在浏览器储存 但是明文不安全 所以有了session,在服务器设置session然后操作判断有没有session,如果有就是登陆状态,如果没有就是未登录状态,退出登陆可以将session清空 然后重定向到'/login' 即重定向登陆,可以通过CONFIG.httpOnly设置为是否浏览器可获取,浏览器端就是cookie
jwt jsonwebtoken 实现登陆注册退出
https://segmentfault.com/a/1190000020231569?utm_source=tag-newest