项目地址:https://github.com/caochangkui/demo/tree/koa-mongoosehtml
数据库名字为:koa-mongoosenode
const mongoose = require('mongoose') // 链接数据库,URL以mongodb:// + [用户名:密码@] +数据库地址[:端口] + 数据库名。(默认端口27017) // 链接mongodb数据库的连接解析器会在将来移除,要使用新的解析器,经过配置{ useNewUrlParser:true }来链接 ;其余警告参考:https://mongoosejs.com/docs/deprecations.html mongoose.connect('mongodb://127.0.0.1:27017/koa-mongoose', {useNewUrlParser:true,useCreateIndex: true}) /** * mongoose从@5.2.8后会弃用一些指令,为防止程序以下警告: * (node:24864) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead. * (node:24841) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect. * 能够以下设置 */ mongoose.set('useNewUrlParser', true) mongoose.set('useFindAndModify', false) mongoose.set('useCreateIndex', true) let db = mongoose.connection mongoose.Promise = global.Promise // 防止Mongoose: mpromise 错误 db.on('error', function (err) { console.log('数据库链接出错', err) }) db.on('open', function () { console.log('数据库链接成功') }) db.on('disconnected', function () { console.log('数据库链接断开') })
/* 声明 Schema 建立数据表模型,即 User,就是数据表的名字 下面给 User 表声明三个字段 username password age */ const userSchema = mongoose.Schema({ username: { type: String, required: true }, password: { type: String, require: true }, age: { type: Number, require: true } }) // 根据 schema 生成 model const model = { User: mongoose.model('User', userSchema) } module.exports = model
const User = require('../dbs.js').User // 从dbs.js引入数据表 /** * 数据库操做 */ // 增长用户,方法一:save() const saveUser = async (ctx) => { // 经过实例化一个 User 对象在添加用户 const newUser = new User({ username: 'cedric', password: '123', age: 27 }) let code = 0 // 状态码 let result = '' // 返回内容 try { let doc = await newUser.save() code = 0 result = '保存成功, ' + doc } catch (err) { code = -1 result = '保存失败, ' + err } ctx.response.body = { code, result } return result } // 增长用户,方法二:create(), 推荐此方法 // 使用save()方法,须要先实例化为文档,再使用save()方法保存文档。而create()方法,则直接在模型Model上操做,而且能够同时新增多个文档 const createUser = async (ctx) => { let code = 0 // 状态码 let result = '' // 返回内容 try { let doc = await User.create({ username: 'cedric222', password: '123', age: 27 }, { username: 'cedric333', password: '123', age: 27 }) code = 0 result = '保存成功, ' + doc } catch (err) { code = -1 result = '保存失败, ' + err console.log(err) } ctx.response.body = { code, result } return result } // 根据用户名查找用户 const findUser = async (ctx) => { let code = 0 // 状态码 let result = '' // 返回内容 try { let doc = await User.findOne({ username: 'cedric222' }) code = 0 result = '查找结果: ' + doc } catch (err) { code = -1 result = '查找失败: ' + err } ctx.response.body = { code, result } return result } // 根据指定条件查找全部用户 // find指的是查找指定表的全部数据,返回的是数组 // findOne指的是查找指定表的单条数据,返回一个对象 const findAllUser = async (ctx) => { let code = 0 // 状态码 let result = '' // 返回内容 try { let doc = await User.find({}) code = 0 result = '查找结果: ' + doc } catch (err) { code = -1 result = '查找失败: ' + err } ctx.response.body = { code, result } return result } // 修改用户数据 // conditions: 查询条件;updateDoc:须要修改的数据, 都是一个对象 // multi (boolean): 默认为false。是否更新多个查询记录。 // https://segmentfault.com/a/1190000012095054#articleHeader16 // https://mongoosejs.com/docs/api.html#model_Model.update const updateUser = async (ctx) => { let code = 0 // 状态码 let result = '' // 返回内容 try { let doc = await User.update({age: 27}, {age: 28}, {multi: true}) code = 0 result = '修改结果: ' + doc console.log(doc) } catch (err) { code = -1 result = '修改失败: ' + err } ctx.response.body = { code, result } return result } // 删除用户数据 const removeUser = async (ctx) => { let code = 0 // 状态码 let result = '' // 返回内容 try { let doc = await User.remove({username: 'cedric444'}) code = 0 result = '删除成功: ' + doc console.log(doc) } catch (err) { code = -1 result = '删除失败: ' + err } ctx.response.body = { code, result } return result } module.exports = { saveUser, createUser, findUser, findAllUser, updateUser, removeUser }
const Koa = require('koa') const app = new Koa(); const Router = require('koa-router') // koa路由中间件 const router = new Router({ prefix: '/api' }) // 父路由, 给路由统一加个前缀 /api const bodyParser = require('koa-bodyparser') // 处理post请求,把 koa2 上下文的表单数据解析到 ctx.request.body 中 app.use(bodyParser()) // 引入数据库操做方法 const UserController = require('./server/controller/users.js') // 路由,访问:http://localhost:3333/api/save router.get('/save', UserController.saveUser) router.get('/create', UserController.createUser) router.get('/find', UserController.findUser) router.get('/findall', UserController.findAllUser) router.get('/update', UserController.updateUser) router.get('/remove', UserController.removeUser) // 加载路由中间件 app.use(router.routes()) // allowedMethods 处理的业务是当全部路由中间件执行完成以后,若ctx.status为空或者404的时候,丰富response对象的header头 app.use(router.allowedMethods()) app.listen(3333, () => { console.log('This server is running at http://localhost:' + 3333) })