多译 · 更新日志页面开发(五) 简单使用 eggjs和MongoDB

前些天在前端用Mock数据来进行开发,最近把后端给写了一下。

同样在别人的项目基础上开发确实是很容易的。

1、路由

在router中增加两个router接口

1
2
3
4
5
6
7
8
9
// 获取更新日志内容
router.get('/software/changelog', controller.software.getChangelog);
// 提交更新日志
router.post(
'/admin/uploadchangelog',
app.middleware.jwtAuth(),
app.middleware.checkAdmin(),
controller.software.uploadChangelog
);

2、controller

controller负责针对不同的URL请求进行数据处理

1
2
3
4
5
6
7
public async getChangelog() {
const res = await this.ctx.model.Software.find().sort({ ['version']: -1 });
this.ctx.body = {
success: true,
data: res,
};
}

controller中的函数应当是async函数,而其中对于数据库的操作应当用await,因为数据库的query是异步的。

3、Mongoose

Mongoose是js对于MongoDB操作的库。它通过在js中定义schema来定义数据库的结构。并且它和数据库是同步的。

不用像MySQL那样create table了,这就是新世纪的数据库哈哈哈哈

另外Mongoose的query好像也很复杂,这些东西等以后学了数据库再来慢慢学吧

4、中间件

关注router中的第二个接口,我们在path和controller方法中间增加了两个函数,其作用主要是进行鉴权。这里用到了Eggjs的中间件。

我们只需要在middleware中定义一个中间件,即可在router中使用

1
2
3
4
5
6
7
8
9
10
11
12
13
export default () => async (ctx: Context, next) => {
const user = await ctx.helper.verifyAdmin();
const {uid}=JSON.parse(JSON.stringify(user));
const id = await ctx.model.User.findOne( {_id:uid} );
if(id&&id.admin){
ctx.state.user = user;
await next();
}
else
{
ctx.throw(401, "not admin");
}
};

miniproject也就此结束了。这个项目实现的效果虽然很简单,但我还是很有成就感的,毕竟我也算是学会了React哈哈哈哈

最近这段时间有点忙。这个学期简直致命,数逻、oop各种大作业接踵而至。我要开始写大作业和复习了。