koa-连接mongodb数据库、创建接口

1,325 阅读2分钟

一、连接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();