koa项目搭建
一、初始化项目
npm init -y
二、安装依赖
npm i koa
npm i koa-router
npm i mongoose
三、构建服务
访问所有路径都会返回hello World
const Koa = require('koa');
const app = new Koa();
app.use(async ctx => {
ctx.body = 'Hello World';
});
app.listen(5000);
console.log('app started at port 3000...');
四、添加路由
const Koa = require('koa');
const Router = require('koa-router');
// 引入并实例化(简便写法)
// const router = require('koa-router')();
// 实例化
const app = new Koa();
const router = new Router();
// 路由
router.get('/index', async ctx => {
ctx.body = '首页'
});
// 路由配置
app.use(router.routes()).use(router.allowedMethods());
const port = process.env.PORT || 5000;
app.listen(port);
console.log(`app started at port ${port}...`);
五、 抽离路由文件
在项目根目录下新建routers文件其中包含api文件夹下对应不同模块的路由地址
routes/api/users文件内容
const router = require('koa-router')();
router.get('/user', async ctx => {
ctx.body = {
msg: 'user',
data: 'hello'
}
});
module.exports = router.routes();
入口文件对路由的配置
引入路由文件:const users = require('./routers/api/users');
配置路由地址:router.use('/api/users', users);
const Koa = require('koa');
const Router = require('koa-router');
// 引入并实例化
// const router = require('koa-router')();
// 引入路由文件
const users = require('./routers/api/users');
// 实例化
const app = new Koa();
const router = new Router();
// 配置路由地址访问loacalhost: 5000/api/users时会进入users文件,再根据users文件中的路由分别匹配
router.use('/api/users', users);
// 路由配置
app.use(router.routes()).use(router.allowedMethods());
const port = process.env.PORT || 5000;
app.listen(port);
console.log(`app started at port ${port}...`);
六、连接mongodb数据库
1、引入mongdb数据库连接地址 const mongodbUrl = require('./config/key').mongodbUrl;
在根目录下新建config 文件夹下放置mongodb数据库连接地址
./config/key.js
module.exports = {
mongodbUrl: '你的mongodb数据连接地址'
}
2、连接数据库
mongoose.connect(mongodbUrl, { useNewUrlParser: true })
.then(
() => {
console.log('mongdb 运行中...')
}
)
.catch(
(err) => {
console.log(err)
}
)
入口文件完整代码
const Koa = require('koa');
const Router = require('koa-router');
// 引入并实例化
// const router = require('koa-router')();
const mongoose = require('mongoose');
// 引入路由文件
const users = require('./routers/api/users');
// 引入mongdb数据库连接地址
const mongodbUrl = require('./config/key').mongodbUrl;
// 实例化
const app = new Koa();
const router = new Router();
// 连接数据库
mongoose.connect(mongodbUrl, { useNewUrlParser: true })
.then(
() => {
console.log('mongdb 运行中...')
}
)
.catch(
(err) => {
console.log(err)
}
)
// 配置路由地址访问loacalhost: 5000/api/users时会进入users文件,再根据users文件中的路由分别匹配
router.use('/api/users', users);
// 路由配置
app.use(router.routes()).use(router.allowedMethods());
const port = process.env.PORT || 5000;
app.listen(port);
console.log(`app started at port ${port}...`);
七、数据库存储数据
在根目录新建models文件该文件用来存放实例数据模版
./models/User.js
用户注册需要往数据库记录的数据为name
、email
、password
、avatar
、date
、
type为存储类型
required为是否必填
default:为默认值
更多可以查看mongoose中文网
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
// 实例化数据模版
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)
在路由文件中进行数据处理存储
./routers/api/users.js
const router = require('koa-router')();
const User = require('../../models/User');
router.get('/user', async ctx => {
ctx.body = {
msg: 'user',
data: 'hello'
}
});
router.post("/register", async ctx => {
// mongoose查询语句find
const findResult = await User.find({
email: ctx.request.body.email
});
if (findResult.length > 0) {
ctx.status = 500,
ctx.body = {
"email": "邮箱已被占用"
}
} else {
const avatar = '';
const newUser = new User({
name: ctx.request.body.name,
email: ctx.request.body.email,
avatar,
password: ctx.request.body.password
})
// 存储到数据库
await newUser
.save()
.then(
(user) => {
ctx.body = user
}
)
.catch(
(err) => {
console.log(err)
}
);
// // 返回json数据
ctx.body = newUser
}
})
module.exports = router.routes();
注:
1、要想在post请求中获取前端传递过来的值(ctx.request.body.email)必须在入口文件引入koa-bodyparser中间件
引入koa-bodyparser中间件const bodyParser = require('koa-bodyparser');
使用koa-bodyparser中间件app.use(bodyParser());
2、用户存储在数据库中的数据都为明文若想加密存储可以使用bcryptjs
加密示例在newUser之后(要返回promise哦否则会不执行加密直接存入数据库)
await new Promise((resolve) => {
bcrypt.genSalt(10, (err, salt) => {
bcrypt.hash(newUser.password, salt, (err, hash) => {
// Store hash in your password DB.
if (err) throw err;
newUser.password = hash;
resolve();
});
});
})
3、还有其他一些中间件可以自行google、百度、npm了解
如:
提供用户鉴权的框架 koa-passport
、
token生成jsonwebtoken
、
表单验证validator
、
全球公认头像gravatar
...