一、连接mongodb数据库
需要用到 Mongoose ,是让我们可以通过 Node 来操作 MongoDB 数据库的一个模块。
1.安装mongoose
cnpm install mongoose --save
2.引入模块
const mongoose=require('mongoose');
3.连接数据库
//数据库的连接状态 mongoose.connect('mongodb://数据库ip地址 : 端口号( 默认端口**27017**可以省略 )/数据库名')
mongoose.connect('mongodb://127.0.0.1:27017/testKoa'{useNewUrlParser:true})
.then(()=>{
console.log('Mongodb Connectd...');
}).catch(err=>{
console.log(err);
});
创建测试接口:
routes/api/users.js
const Router=require("koa-router");
const router= new Router();
/**
* @route GET api/users/test
* @desc 测试接口地址
* @access 接口是公开的
*/
// test
router.get("/test",async ctx=>{
ctx.status=200;
ctx.body={msg:'users works...'};
});
module.exports=router.routes();
然后在 app.js 引入 users.js
const users=require('./routes/api/users');
配置路由地址
router.use('/api/users',users);
二、创建用户模型:
Mongoose 的一切始于 Schema。每个 schema 都会映射到一个 MongoDB collection ,并定义这个collection里的文档的构成(约束数据库中的文档结构)。
创建模型:
models/User.js
1.引入模块
const mongoose=require('mongoose');
2.定义模型
const Schema=mongoose.Schema;
3.实例化数据模板
const UserSchema=new Schema({
name:{
type:String,
required:true
},
email:{
type:String,
required:true
},
password:{
type:String,
required:true
},
avatar:{
type:String,
},
date:{
type:Date,
default:Date.now
}
});
module.exports=User=mongoose.model("users",UserSchema);
创建注册接口:
users.js
/**
* @route POST api/users/register
* @desc 注册接口地址
* @access 接口是公开的
*/
//引入模型
const User=require("../../models/User");
//加密
const bcrypt=require('bcryptjs');
router.post("/register",async ctx=>{
// console.log(ctx.request.body);
// 存储到数据库
const findResult= await User.find({email:ctx.request.body.email});
// console.log(findResult);
if(findResult.length>0){
ctx.status=500;
ctx.body={email:'邮箱已被占用'}
}else{
// not found
const newUser=new User({
name:ctx.request.body.name,
email:ctx.request.body.email,
password:ctx.request.body.password
});
//对password进行加密
await bcrypt.getSalt(10,(err,salt)=>{
bcrypt.hash(newUser.password,salt,(err,hash)=>{
// console.log(hash);
if (err) throw err;
newUser.password=hash;
});
});
// console.log(newUser);
// 存储到数据库
await newUser.save().then(user=>{
ctx.body=user;
}).catch(err=>{
console.log(err);
})
}
});
完整代码
app.js
const koa=require('koa');
const Router=require('koa-router');
const mongoose=require('mongoose');
const bodyParser=require('koa-bodyparser');
// 实例化koa
const app=new koa();
const router=new Router();
app.use(bodyParser());
// 引入users.js
const users=require('./routes/api/users');
// 路由
router.get("/",async ctx=>{
ctx.body={msg:"Hello Koa Interfaces"};
})
// 连接数据库
mongoose.connect('mongodb://127.0.0.1:27017/testKoa'{useNewUrlParser:true})
.then(()=>{
console.log('Mongodb Connectd...');
}).catch(err=>{
console.log(err);
});
// 配置路由地址 localhost:5000/api/users
router.use('/api/users',users);
// 配置路由
app.use(router.routes()).use(router.allowedMethods());
const port=process.env.PORT || 5000;
app.listen(port,()=>{
console.log(`server started on ${port}`)
})
routes/api/users.js
const Router=require("koa-router");
const router= new Router();
const bcrypt=require('bcryptjs');
// /引入User
const User=require("../../models/User");
/**
* @route GET api/users/test
* @desc 测试接口地址
* @access 接口是公开的
*/
// test
router.get("/test",async ctx=>{
ctx.status=200;
ctx.body={msg:'users works...'};
});
/**
* @route POST api/users/register
* @desc 注册接口地址
* @access 接口是公开的
*/
router.post("/register",async ctx=>{
// console.log(ctx.request.body);
// 存储到数据库
const findResult= await User.find({email:ctx.request.body.email});
// console.log(findResult);
if(findResult.length>0){
ctx.status=500;
ctx.body={email:'邮箱已被占用'}
}else{
// not found
const newUser=new User({
name:ctx.request.body.name,
email:ctx.request.body.email,
password:ctx.request.body.password
});
await bcrypt.getSalt(10,(err,salt)=>{
bcrypt.hash(newUser.password,salt,(err,hash)=>{
// console.log(hash);
if (err) throw err;
newUser.password=hash;
});
});
// console.log(newUser);
// 存储到数据库
await newUser.save().then(user=>{
ctx.body=user;
}).catch(err=>{
console.log(err);
})
// 返回json数据
ctx.body=newUser;
}
});
module.exports=router.routes();