相关说明

Egg.js(以下简称Egg)

Express 是 Node.js 社区广泛使用的框架,简单且扩展性强,非常适合做个人项目。但框架本身缺少约定,标准的 MVC 模型会有各种千奇百怪的写法。Egg 按照约定进行开发,奉行『约定优于配置』,团队协作成本低。

Sails 是和 Egg 一样奉行『约定优于配置』的框架,扩展性也非常好。但是相比 Egg,Sails 支持 Blueprint REST API、WaterLine 这样可扩展的 ORM、前端集成、WebSocket 等,但这些功能都是由 Sails 提供的。而 Egg 不直接提供功能,只是集成各种功能插件,比如实现 egg-blueprint,egg-waterline 等这样的插件,再使用 sails-egg 框架整合这些插件就可以替代 Sails 了。

Egg的特性

  • 提供基于 Egg 定制上层框架的能力

  • 高度可扩展的插件机制

  • 内置多进程管理

  • 基于Koa开发,性能优异

  • 框架稳定,测试覆盖率高

  • 渐进式开发

MongoDB(4.2)

MongoDB是一个基于分布式文件存储 [1] 的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引

它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:

  • 面向集合存储,易存储对象类型的数据。

  • mongodb集群参考

  • 模式自由。

  • 支持动态查询。

  • 支持完全索引,包含内部对象。

  • 支持查询。

  • 支持复制和故障恢复。

  • 使用高效的二进制数据存储,包括大型对象(如视频等)。

  • 自动处理碎片,以支持云计算层次的扩展性。

  • 支持 Golang,RUBY,PYTHON,JAVA,C++,PHP,C#, NODE等多种语言。

  • 文件存储格式为BSON(一种JSON的扩展)。

  • 可通过网络访问。

Mongoose

Node.js 的MongoDB ORM

uni-app

tree new bee

环境需求

Nodejs 建议选择 LTS 版本,最低要求 8.x
MongoDB 建议使用4.2版本
Redis 最新版本

安装及配置

nodejs 的安装请查看对应的官方文档

Egg 安装

$ mkdir egg-example && cd egg-example
$ npm init egg --type=simple
$ npm i
    ```
```JavaScript
$ npm run dev
$ open http://localhost:7001

MongoDB

提供linux RedHat(CentOS)安装示例:

CentOS 去掉sudo

创建 /etc/yum.repos.d/mongodb-org-4.2.repo

文件内容为:

安装基础

sudo yum install -y mongodb-org

安装控制

sudo yum install -y mongodb-org-4.2.10 mongodb-org-server-4.2.10 mongodb-org-shell-4.2.10 mongodb-org-mongos-4.2.10 mongodb-org-tools-4.2.10

启动

sudo systemctl start mongod

安装项目所需插件

1.egg-jwt 标准TOKEN生成校验
2.egg-mongoose MongoDB Nodejs ORM
3.egg-cors插件 跨域插件
4.egg-validate 数据校验插件
4.lodash JS函数库
5.momentjs JS时间处理函数库
6.request http处理包(貌似已弃用)
7.request-promise-native request promise化包(也可用nodejs自带)
8.stream-to-array,stream-wormhole egg上传内存销毁相关包

附package.json

  "devDependencies": {
    "autod": "^3.0.1",
    "autod-egg": "^1.1.0",
    "await-stream-ready": "^1.0.1",
    "egg-bin": "^4.11.0",
    "egg-ci": "^1.11.0",
    "egg-cors": "^2.2.3",
    "egg-jwt": "^3.1.7",
    "egg-mock": "^3.21.0",
    "egg-mongoose": "^3.3.0",
    "egg-validate": "^2.0.2",
    "eslint": "^5.13.0",
    "eslint-config-egg": "^7.1.0",
    "lodash": "^4.17.20",
    "moment": "^2.28.0",
    "request": "^2.88.2",
    "request-promise-native": "^1.0.9",
    "stream-to-array": "^2.3.0",
    "stream-wormhole": "^1.1.0"
  },

egg 插件配置文件 /config/plugin.js

'use strict';

/** @type Egg.EggPlugin */
exports.validate = {
    enable: true,
    package: 'egg-validate',
};
exports.mongoose = {
    enable: true,
    package: 'egg-mongoose',
};
exports.jwt = {
    enable: true,
    package: "egg-jwt"
};
exports.cors = {
    enable: true,
    package: 'egg-cors',
};

exports.redis = {
    enable: true,
    package: 'egg-redis',
};

egg 配置文件 /config/

/* eslint valid-jsdoc: "off" */

'use strict';

/**
 * @param {Egg.EggAppInfo} appInfo app info
 */
module.exports = appInfo => {
    /**
     * built-in config
     * @type {Egg.EggAppConfig}
     **/
    const config = exports = {};

    // use for cookie sign key, should change to your own and keep security
    config.keys = appInfo.name + '_1600096669632_8743';

    config.middleware = ['fm', 'errorHandler', 'responseFormatter', 'jwtErrorHandler'];
    // csrf 设置
    config.security = {
        csrf: {
            enable: false,
            ignoreJSON: true
        },
        domainWhiteList: ['http://localhost', 'http://127.0.0.1', '*']
    };
    // 跨域
    config.cors = {
        origin: '*',
        allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS',
        credentials: true,
    };
    // 小程序配置
    config.wxmpCf = {
        appid: '您的小程序APPID',
        secret: '您的小程序密钥'
    };
    // 项目可能回连接多个/多种数据库 这里我们默认只使用mp的MongoDB数据库
    config.mongoose = {
        clients: {
            basic: {
                url: 'mongodb://127.0.0.1:27017/您的数据库名称',
                options: {},
            },
            mp: {
                url: 'mongodb://127.0.0.1:27017/您的数据库名称2',
                options: {},
            }
        },
    };
    // 代理获取真实IP
    config.proxy = true;
    // 地图接口设置
    config.wmap = {
        amap: { key: '高德地图key' },
        txmap: { key: '腾讯地图key' }
    };
    // add your user config here
    const userConfig = {
        // myAppName: 'egg',
    };
    return {
        ...config,
        ...userConfig,
    };
};

项目目录结构

  • app 项目主目录
    • controller 控制目录
    • extend 扩展
    • libs 第三方代码
    • middlewear 中间件
    • model 数据库模型
    • public 静态文件
    • router 路由(路由太多的情况使用)
    • rules 数据校验文件
    • schedule 定时任务
    • service 服务
    • view 页面模板
      router.js 路由文件
  • config
    • config.default.js 项目配置文件
    • plugin egg插件
      app.js
      agent.js