項目位址:https://github.com/caochangkui/demo/tree/koa-mongoose
連接配接資料庫
資料庫名字為:koa-mongoose
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
定義 mongoose 資料庫操作方法
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
}
入口檔案app.js
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)
})