---
layout: post
title: egg.js开发博客
date: 2018-04-20 16:34:44
categories: javascript学习笔记
tags: egg.js
author: 朋也
---

* content
{:toc}

业余时间学了一下egg.js，并开发了个非常简单的博客，实现了 CRUD 功能，总结一下

## 安装

```bash
$ npm i egg-init -g
$ egg-init eblog --type=simple
$ cd eblog
$ yarn install
```




## 路由

官方文档上说的很清楚了

参考：[https://eggjs.org/zh-cn/basics/router.html](https://eggjs.org/zh-cn/basics/router.html)

## controller里取值方法

请求数据有三种: query, params, body

query取值方式：`const id = this.ctx.request.query.id` 适用于：`/post?id=1`

params 取值方式：`const id = this.ctx.params.id` 适用于：`/post/1`

body 取值方式 `const id = this.ctx.request.body.id` 适用于form表单提交

## 输出

开发网站有时候要输出渲染后的模板，有时候要输出json数据

输出模板 `this.ctx.render('index.nunjucks', {posts: posts});`

输出json `this.ctx.body = {code: 200, desc: 'success', detail: null}`

## cookie和session

官方文档说的也很清楚，[https://eggjs.org/zh-cn/core/cookie-and-session.html](https://eggjs.org/zh-cn/core/cookie-and-session.html)

说一下页面上怎么取session里的数据，我用的是nunjucks，取值方法：{{ ctx.session.user }}

## 拦截器

官方文档上也叫中间件，我习惯叫拦截器，当用户想编辑自己的博客的时候，会用到这个功能，跟在express里的用法差不多，下面来说一下

在 `app` 文件夹下建一个 `middleware` 文件夹，新建一个文件并加上下面内容

```js
'use strict';

module.exports = () => {

  /*
   * 需要登录
   */
  return async (ctx, next) => {
    if (!ctx.session.user) {
      return ctx.render('login.nunjucks');
    }
    await next();
  };
};

```

然后在 router.js 里通过下面方法来取这个中间件

```js
const { controller, middleware } = app;
const userRequired = middleware.userRequired();

router.get('/admin/index', userRequired, controller.admin.index);
```

## 参考

- [https://eggjs.org/](https://eggjs.org/)
- [eblog-egg](https://github.com/tomoya92/eblog-egg)
