基于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,可以得到以下输出说明成功

相关推荐
喝拿铁写前端11 分钟前
技术是决策与代价的平衡 —— 超大系统从 Vue 2 向 Vue 3 演进的思考
前端·vue.js·架构
拾光拾趣录18 分钟前
虚拟滚动 + 加载:让万级列表丝般顺滑
前端·javascript
然我27 分钟前
数组的创建与遍历:从入门到精通,这些坑你踩过吗? 🧐
前端·javascript·面试
豆豆(设计前端)34 分钟前
如何成为高级前端开发者:系统化成长路径。
前端·javascript·vue.js·面试·electron
今天你写算法了吗39 分钟前
ScratchCard刮刮卡交互元素的实现
前端·javascript
FogLetter1 小时前
深入浅出 JavaScript 数组:从基础到高级玩法
前端·javascript
一小池勺1 小时前
🚀 clsx vs shadcn/ui的cn函数:前端类名拼接工具大PK
前端
lens941 小时前
RSC、SSR傻傻分不清?一文搞懂所有渲染概念!
前端·next.js
spionbo1 小时前
前端部署VuePress Theme Hope主题部署到gitlab,使用pnpm构建,再同步到netlify绑定腾讯云域名实现
前端
小华同学ai2 小时前
惊喜! Github 10k+ star 的国产流程图框架,LogicFlow 能解你的图编辑痛点?
前端·后端·github