前端也可以写后台,node-eggjs

692 阅读4分钟

我相信很多前端小伙伴,跟我一样都想搭建自己的一个服务器,自己也能写后端;

有的小伙伴可能是为了搭建自己的博客,也有的小伙伴是为了自己写一些项目(比如:小程序,工具类网站等);还有我这种就为了装的人,哈哈哈

不管因为什么原因去学习,他们都是值得我们赞扬和学习的对象;

同时在这儿把我的座右铭送给大家:

别因今天的懒惰,让明天后悔

下面我们开始今天的正题:eggjs的项目搭建

我们可以根据官方文档来搭建

官文文档给大家提供了快捷式搭建的方法:小伙伴们根据这个创建文件即可

npm i egg-init -g // 安装egg

mkdir egg-example 
cd egg-example
npm init egg --type=simple
npm i

当我们执行到npm init egg --type=simple时,会提示以下内容,这是官方给大家封装好的;可以根据自己的需要选择,我选择的是第一个基础组件

  microservice - Microservice app boilerplate based on egg
  sequelize - egg app with sequelize
  ts - Simple egg && typescript app boilerplate
  empty - Empty egg app boilerplate
  plugin - egg plugin boilerplate
  framework - egg framework boilerplate

后面一直回车就行,当完成以后;npm i 即可

然后我们用Postman去请求你的本地ip链接地址,就会返回:

npm run dev 启动项目

hi, egg

这儿跟大家说一说比较重要的文件目录:

如果写了重要的,就是我们需要经常使用的文件;主要的文件我都会说明以及用途等(可能不会说特别详细,会讲个大概);非主要的你们大致也都知道是啥,我就没必须要去重复说了

  • app
    • controller
    • router
  • config
.
├─ .eslintignore
├─ .eslintrc
├─ .github
│    └─ workflows
│           └─ nodejs.yml
├─ .gitignore
├─ README.md
├─ app // 重要
│    ├─ controller // 重要: 主要写接口文件,可以在里面创建多个子文件:如home.js
│    │    └─ home.js
│    ├─ public // 重要:你如果有一些图片资源需要保存(系统盘),那么一般就是保存在这儿
│    └─ router.js // 重要: 路由配置文件,如果你接口路由名称等,以及登录验证(token)
├─ config // 重要:下面的两个文件主要是限制一些跨域,是否开启防御,mysql插件等
│    ├─ config.default.js
│    └─ plugin.js
├─ jsconfig.json
├─ logs // 日志
│    └─ example
│           ├─ common-error.log
│           ├─ egg-agent.log
│           ├─ egg-schedule.log
│           ├─ egg-web.log
│           └─ example-web.log
├─ package-lock.json
└─ package.json

做到这儿,大家也都能创建项目了,那么我们就可以开始写接口了,为让大家可以更好的学习我写两个假数据接口吧!

一个get,一个post(接收参数等)

GET

我在这儿就不新创建文件了;我将在controller/home.js里面写即可

// app/controller/home.js 文件
async learn () {
    const { ctx } = this;
    ctx.body = {
      code:200,
      msg:'成功',
      data:[{id:1},{id:2}]
    };
  }

增加路由接口

// app/router.js 文件
router.get('/learn', controller.home.learn);

如果你写到这儿然后通过Postman去发送请求,一直没有返回数据的话,你重启一下项目即可!

启动项目后,你再次发送请求,会发现;控制台发出了警告!

原因是eggjs默认开启了防御功能,禁止访问,这个时候我们需要关闭防御

然后就可以正常请求啦

找到config/plugin.js

// config/plugin.js 文件
security: { // 关闭csrf防御
    enable: false,
},

报错提示:

2023-02-24 18:21:34,971 WARN 3924 invalid csrf token. See https://eggjs.org/zh-cn/core/security.html#安全威胁csrf的防范
2023-02-24 18:21:34,973 WARN 3924 nodejs.ForbiddenError: invalid csrf token
    at Object.throw (D:\Test\egg-example\node_modules\koa\lib\context.js:97:11)
    at Object.assertCsrf (D:\Test\egg-example\node_modules\egg-security\app\extend\context.js:163:32)
    at csrf (D:\Test\egg-example\node_modules\egg-security\lib\middlewares\csrf.js:39:9)
    at dispatch (D:\Test\egg-example\node_modules\egg-security\node_modules\koa-compose\index.js:42:32)
    at D:\Test\egg-example\node_modules\egg-security\node_modules\koa-compose\index.js:34:12
    at dispatch (D:\Test\egg-example\node_modules\koa\node_modules\koa-compose\index.js:42:32)
    at session (D:\Test\egg-example\node_modules\koa-session\index.js:41:13)
    at dispatch (D:\Test\egg-example\node_modules\koa\node_modules\koa-compose\index.js:42:32)
    at overrideMethod (D:\Test\egg-example\node_modules\koa-override\index.js:38:12)
    at dispatch (D:\Test\egg-example\node_modules\koa\node_modules\koa-compose\index.js:42:32)
message: "invalid csrf token"
pid: 3924
hostname: DESKTOP-DQVCB8H

返回结果:

{
    "code": 200,
    "msg": "成功",
    "data": [
        {
            "id": 1
        },
        {
            "id": 2
        }
    ]
}

get 如果需要传值的话:

有一下这个方式:即可接收到前台传递过来的值

var query = ctx.query; // 接收值

router.get('/learn', controller.home.learn); // 路由方式

POST

controller/home.js文件:

request.body就是接收前台传递过来的参数;

// app/controller/home.js 文件
async setPost () {
    const { ctx } = this;
    const { page = 1,pageSize = 20 } = ctx.request.body;
    ctx.body = {
      code:200,
      msg:'成功',
      data:{page,pageSize}
    };
  }

增加路由接口

// app/router.js 文件
router.post('/setPost', controller.home.setPost);

然后发送接口请求吗,成功返回:

{
    "code": 200,
    "msg": "成功",
    "data": {
        "page": 1,
        "pageSize": 20
    }
}

到这儿,基本的接口就完成了!

后面我会根据文档一写篇关于egg-mysql使用的文章;期待到时候我写作有所提升吧!哈哈哈

往期文章