基于eggjs+mongodb实现后端服务

一、准备工作

1、 创建一个 eggjs 项目

js 复制代码
 mkdir ~/Desktop/base-cli-server & cd ~/Desktop/base-cli-server
 npm init egg --type=simple
 npm inpm run dev
 open http://localhost:7001

2、安装和启动 mongodb

本案例为macos本地实现

www.runoob.com/mongodb/mon...

  • 启动:

mongod --dbpath /usr/local/var/mongodb --logpath /usr/local/var/log/mongodb/mongo.log --fork

  • 验证是否启动:

ps aux | grep -v grep | grep mongod

  • 关闭:

kill -9 pid

3、数据库可视化工具

robomongo.org/

安装完毕之后,首先终端启动 mongodb,然后启动 studio 3T,选择快速创建连接,暂不设置用户不设置权限连接

由于 MongoDB 实例目前没有创建任何用户,也就是 没有启用认证(auth)。可以无需用户名和密码就能连接,连接字符串可以写成:

mongodb://localhost:27017/base-cli

如果你需要启用认证(本次实践暂不设置),下一步就是创建用户:

js 复制代码
    use admin
    db.createUser({
      user: "admin",
      pwd: "你的密码",
      roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
    })

4、 下面介绍 studio 3T 的使用(外篇)

  • 创建数据库
  • 创建数据集合

在创建表的同时创建字段并且进行验证规则约束

js 复制代码
    {
      "$jsonSchema": {
        "bsonType": "object",
        "required": ["name", "age", "email"],
        "properties": {
          "name": { "bsonType": "string" },
          "age": { "bsonType": "int", "minimum": 18 },
          "email": { "bsonType": "string", "pattern": "^.+@.+\..+$" }
        }
      }
    }

如果在创建表的同时没有创建验证规则也是可以的

  • 查看集合验证规则
  • 添加多条记录
js 复制代码
    db.getCollection("test_table").insertMany([
      { name: "Alice Johnson",  age: 25, email: "alice.j@example.com" },
      { name: "Bob Chen",       age: 30, email: "bob.chen@work.org"   },
      { name: "Carlos López",   age: 22, email: "carlos@example.es"   },
      { name: "王芳",           age: 18, email: "wang.fang@example.cn"},
      { name: "Emily O'Connor", age: 27, email: "emily@sub.domain.net"}
    ]);
  • 查询记录

db.getCollection( "test_table" ) .find({})

二、项目实现

1、创建数据库和表

使用 studio3T 创建一个数据库 base-clibase-cli 下创建一个表 product_table,其验证规则为:

js 复制代码
{
  "$jsonSchema": {
    "bsonType": "object",
    "required": [
      "name",
      "price",
      "stock",
      "category",
      "tags"
    ],
    "properties": {
      "name": {
        "bsonType": "string",
        "minLength": 2.0,
        "maxLength": 100.0,
        "description": "商品名称,2-100字符"
      },
      "price": {
        "bsonType": "double",
        "minimum": 0.01,
        "maximum": 100000.0,
        "description": "价格必须为正数,单位为元"
      },
      "stock": {
        "bsonType": "int",
        "minimum": 0.0,
        "maximum": 1000000.0,
        "description": "库存必须为非负整数"
      },
      "category": {
        "bsonType": "string",
        "enum": [
          "数码",
          "家纺",
          "家电",
          "食品",
          "玩具"
        ],
        "description": "商品分类必须是预定义值之一"
      },
      "tags": {
        "bsonType": [
          "array"
        ],
        "minItems": 1.0,
        "maxItems": 10.0,
        "uniqueItems": true,
        "items": {
          "bsonType": "string",
          "minLength": 1.0,
          "maxLength": 20.0
        },
        "description": "标签数组,1-10个不重复字符串"
      }
    }
  }
}
js 复制代码
 db.getCollection("product_table").insertMany([
   {
     "name": "无线蓝牙耳机",
     "price": 299.99,
     "stock": 150,
     "category": "数码",
     "tags": ["蓝牙5.0", "降噪", "长续航"]
   },
   {
     "name": "纯棉四件套",
     "price": 458.45,
     "stock": 80,
     "category": "家纺",
     "tags": ["纯棉", "北欧风", "抗菌", "加厚"]
   },
   {
     "name": "变频空调",
     "price": 3299.43,
     "stock": 25,
     "category": "家电",
     "tags": ["节能", "静音", "智能控制", "冷暖"]
   },
   {
     "name": "黑巧克力礼盒",
     "price": 128.84,
     "stock": 300,
     "category": "食品",
     "tags": ["可可70%", "无蔗糖", "比利时进口"]
   },
   {
     "name": "编程机器人",
     "price": 599.04,
     "stock": 45,
     "category": "玩具",
     "tags": ["STEM教育", "可编程", "传感器", "互动", "锂电池"]
   }
 ])

查询是否插入成功

2、创建连接 mongodb 数据库的配置文件

  • 安装依赖库@pick-star/cli-mongodb

    js 复制代码
    npm i -s @pick-star/cli-mongodb
  • 创建文件config/db.js

由于本地安装的 mongodb 并没有设置任何用户,所以无需用户名和密码连接

js 复制代码
 const mongodbUrl = 'mongodb://127.0.0.1:27017';
 const mongodbName = 'base-cli';

 module.exports = {
   mongodbUrl,
   mongodbName,
 };
  • 创建文件app/utils/mongo.js
js 复制代码
    const mongodb = require('@pick-star/cli-mongodb');
    const { mongodbUrl, mongodbName } = require('../../config/db');

    function mongo() {
      return new mongodb(mongodbUrl, mongodbName);
    }
    module.exports = mongo;

3、创建路由

app/router.js下添加指向控制器project 的路由

js 复制代码
    module.exports = app => {
      const { router, controller } = app;
      router.get('/project/getTemplate', controller.project.getTemplate);
    };

4、创建控制器

app/controller/project.js

js 复制代码
const { Controller } = require('egg');
        const mongo = require('../utils/mongo');

        class projectControler extends Controller {
          async getTemplate() {
            const { ctx } = this;
            let data = null;

            data = await mongo().query('product_table');

            ctx.body = data;
          }
        }
        module.exports = projectControler;

5、访问验证

浏览器访问http://127.0.0.1:7001/project/getTemplate,可以得到以下输出说明成功

相关推荐
遗憾随她而去.30 分钟前
前端浏览器缓存深度解析:从原理到实战
前端
万行1 小时前
企业级前后端认证方式
前端·windows
2501_948120151 小时前
基于Vue 3的可视化大屏系统设计
前端·javascript·vue.js
Jinuss1 小时前
源码分析之React中createFiberRoot方法创建Fiber根节点
前端·javascript·react.js
Jinuss2 小时前
源码分析之React中ReactDOMRoot实现
前端·javascript·react.js
web守墓人2 小时前
【前端】vue3的指令
前端
想起你的日子3 小时前
EFCore之Code First
前端·.netcore
框架图3 小时前
Html语法
前端·html
深耕AI3 小时前
【wordpress系列教程】07 网站迁移与备份
运维·服务器·前端·数据库