node.js是一门轻量级后台语言,基于chorme V8引擎的JS运行环境,利用koa框架能够轻易搭建自己本地服务。这里我用koa和mongoDB实现了简单的数据库增删改查。
一、安装依赖
使用npm 或者 yarn 都可以,这里我使用的是yarn
1、yarn add koa //安装koa
2、yarn add koa-router //安装koa-router,轻松实现路由
3、yarn add koa-views //安装koa-views,配置视图模板
4、yarn add koa-body //安装koa-body,用于处理post请求
5、yarn add mongoose //安装mongoose,操作数据库
二、利用koa创建本地服务
koa.js 文件
const Koa = require('koa') const { join } = require('path') const koaBody = require('koa-body') const views = require('koa-views') const router = require('./router') //导入路由模块,下面会有详细代码 const app = new Koa app .use(views(join(__dirname, "views"), { //配置视图模板,html文件存放到文件夹views里面 //node的一个特点就是服务端渲染,这里可以直接配置为html页面,也可配置为pug等模板文件 extension: "html" })) .use(koaBody()) //处理post请求 .use(router.routes()) //1 .use(router.allowedMethods()) //2 //步骤1,2将路由绑定到Koa的实例app身上 .listen(8000,err => { !err && console.log('服务启动成功,端口监听在8000') })至此,命令行输入node koa.js 运行,端口成功监听在8000!
二、通过mongoose连接数据库
mongodb.js 文件1 const mongoose = require('mongoose') 2 //新版mongoose推荐使用createConnection连接数据库,不要使用connect 3 const db = mongoose.createConnection('mongodb://localhost:27017/user',{ 4 //添加这两个参数为了避免警告 5 useNewUrlParser:true, 6 useUnifiedTopology: true 7 }) 8 9 //用es6的Promise覆盖mongoose自实现的Promise,我们用es6的Promise就好了 10 mongoose.Promise = global.Promise 11 db.on('error',(err)=>{console.log(err)}) 12 db.on('open',()=>{console.log('mongodb连接成功')}) 13 const Schema = mongoose.Schema //得到Schema构造函数 14 const UserShcema = new Schema({ //用Schema定义插入数据的类型 15 name:{ 16 type:String, 17 required:true 18 }, 19 age:Number, 20 sex:{ 21 type:String, 22 default:"男" 23 } 24 },{versionKey: false, timestamps: { 25 createdAt: "created" 26 }}) 27 28 //建立集合,规定使用定义好的Shcema标准插入数据,返回一个构造函数 29 const Users = db.model('user',UserShcema) 30 //将Users暴露出去,可以用于操作数据 31 exports.Users = Users数据库代码书写完毕,接下来通过路由的方式来操作数据库,实现增删改查
三、利用koa-router实现路由
router.js 文件const Router = require('koa-router') const { Users } = require('./mongodb') const router = new Router 说明:我们通过localhost:8000访问本地服务,默认返回的是根路由,这时可以渲染index页面,如果前面没有配置视图模板,那么将不存在ctx.render方法。
koa2建议中间件最好使用异步回调,中间件就是跟在路由后面的异步函数,一条路由可以有一个或者多个中间件,通过next方法决定执不执行下一个中间件 router.get('/', async ctx => { await ctx.render('index') }) //增 router.post('/addtion',async ctx => { const { name, age, sex } = ctx.request.body const user = new Users({ name, age, sex }) //save方法是异步的,必须等待它执行完成后才能ctx.body,否则,ctx.body是无法返回到页面的 const isSuccess = await user.save() .then( () => { console.log('保存成功') return true }) .catch( err => { console.log(err) return false }) ctx.body = isSuccess ? '添加成功' : '添加失败' }) //删 router.get('/deletion',async ctx => { const isSuccess = await Users.deleteMany(ctx.query).then( res => { return res }).catch( () => { return false }) ctx.body = isSuccess ? `成功删除了${isSuccess.n}条数据` : '删除失败' }) //改 router.get('/modification',async ctx => { const result = await Users.updateMany( ctx.query, {$set:{'name':'MongoDB'} }).then( res => { return res }).catch( () => { return false }) ctx.body = result ? '修改成功' : '修改失败' }) //查 router.get('/locating',async ctx => { const result = await Users.find(ctx.query).then( res => { return res }).catch( (err) => { return err }) ctx.body = result }) module.exports = router
这里除了增加用户使用的post请求,其余都用get代替了,这样是不规范的,但是为了图简便,仅仅为了表达这个意思。这时我们通过手动修改url参数就能实现增删改查效果: 例如: http://localhost:8000/deletion?age=18 将删除年龄为18的所有用户,因为我使用的是deleteMany,也可以使用deleteOne删除单条