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

相关推荐
指尖跳动的光5 分钟前
前端视角-如何保证系统稳定性
前端
fruge7 分钟前
2025全栈技术深耕与实践:从框架融合到工程落地
前端
秋42717 分钟前
tomcat与web服务器
服务器·前端·tomcat
hdsoft_huge27 分钟前
Java 实现高效查询海量 geometry 及 Protobuf 序列化与天地图前端分片加载
java·前端·状态模式
MoonBit月兔27 分钟前
用 MoonBit 打造的 Luna UI:日本开发者 mizchi 的 Web Components 实践
前端·数据库·mysql·ui·缓存·wasm·moonbit
程序员修心30 分钟前
CSS浮动与表格布局全解析
前端·html
POLITE31 小时前
Leetcode 238.除了自身以外数组的乘积 JavaScript (Day 7)
前端·javascript·leetcode
光影少年1 小时前
AI前端开发需要会哪些及未来发展?
前端·人工智能·前端框架
Vincent_Vang1 小时前
多态 、抽象类、抽象类和具体类的区别、抽象方法和具体方法的区别 以及 重载和重写的相同和不同之处
java·开发语言·前端·ide
菩提小狗1 小时前
小迪安全_第4天:基础入门-30余种加密编码进制&Web&数据库&系统&代码&参数值|小迪安全笔记|网络安全|
前端·网络·数据库·笔记·安全·web安全