# react-manege-server **Repository Path**: pleaseanswer/react-manege-server ## Basic Information - **Project Name**: react-manege-server - **Description**: 初始化 react 服务器-迁移原有nodejs 后台 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-02-07 - **Last Updated**: 2024-02-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: react18配套 ## README ### 1 nodejs + mongodb搭建后台 #### 1.1 搭建本地服务器`server.js` 1. 引入第三方模块`express` 2. 利用`express`创建一个服务器 3. 搭建静态资源服务器 4. 引入路由总中间件 5. 使用路由总中间件 6. 监听服务开启 #### 1.2 配置请求路径 * express.Router() #### 1.3 统一前后端的数据格式 * function formatData #### 1.4 连接数据库 * mongodb.connect() #### 1.5 请求路径模块--方法编写 * express.Router() #### 1.6 实现分页 ### 2 mongoose.Schema #### 2.1 名词解释 * __Schema__: 一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力 * __Model__: 由 `Schema` 发布生成的模型,具有抽象属性和数据库操作能力 * __Entity__: 由 `Model` 创建的实例,也能操作数据库 > `Schema`、`Model`、`Entity` 的关系请牢记:`Schema` 生成 `Model`,`Model` 创造 `Entity`,`Model` 和 `Entity` 都可对数据库操作造成影响,但 `Model` 比 `Entity` 更具操作性。 ##### 关系型数据库 && `mongodb` | 关系型数据库 | mongodb | | -- | -- | | table | collection | | row | document | | column | index | | table | joins | populate | | primary | key_id | #### 2.2 Schema ##### 2.2.1 定义Schema * `mongoose` 中任何事物都是从 `Schema` 开始的。 * 每一个 `Schema` 对应 `MongoDB` 中的一个集合 `collection`。 * `Schema` 中定义了集合中文档 `document` 的样式。 ```js var mongoose = require('mongoose'); var Schema = mongoose.Schema; var blogSchema = new Schema({ title: String, author: String, body: String, comments: [{ body: String, date: Date }], date: { type: Date, default: Date.now }, hidden: Boolean, meta: { votes: Number, favs: Number} }); ``` * 如果之后想要在 `Schema` 中添加键,可以使用 `Schema#add` 方法。 ##### 2.2.2 Schema.Type * `String` * `Number` * `Date` * `Buffer` * `Boolean` * `Mixed` * `Objectid` * `Array` ```js var Schema = new Schema({ name: String, binary: Buffer, isDeleted: Boolean, updated: Date, age: Number, mixed:Schema.Types.Mixed, _id:Schema.Types.ObjectId, //主键 _fk:Schema.Types.ObjectId, //外键 array: [], arrOfString: [String], arrOfNumber: [Number], arrOfDate: [Date], arrOfBuffer: [Buffer], arrOfBoolean: [Boolean], arrOfMixed: [Schema.Types.Mixed], arrOfObjectId: [Schema.Types.ObjectId], nested:{ stuff: String, } }) ``` * `Buffer` 和 `ArrayBuffer` 是 `Nodejs` 两种隐藏的对象 ##### 2.2.3 Schema.Type.Mixed * `Schema.Types.Mixed` 是 `Mongoose` 定义个混合类型,该混合类型如果未定义具体形式 ```js var AnySchema = new Schema({ any: { }}) var AnySchema = new Schema({ any: Schema.Types.Mixed }) ``` * 混合类型因为没有特定约束,因此可以任意修改,一旦修改了原型,则必须调用 `markModified()` ```js person.anything = { x: [ 3, 4, { y: 'change' }]} person.markModified('anything') //传入anything,表示该属性类型发生变化 person.save() ``` ##### 2.2.4 ObjectId * 主键,一种特殊而且非常重要的类型,每个 `Schema` 都会默认配置这个属性,属性名为 `_id`,除非自己定义,方可覆盖 ```js var mongoose = require('mongoose') var ObjectId = mongoose.Schema.Types.ObjectId var StudentSchema = new Schema({ }) //默认会有_id:ObjectId var TeacherSchema = new Schema({ id: ObjectId }) //只有id:ObjectId ``` ##### 2.2.5 Array * `Array` 在 `JavaScript` 编程语言中并不是数组,而是集合,因此里面可以存入不同的值 ```js // 以下代码等价: var ExampleSchema1 = new Schema({ array: [] }) var ExampleSchema2 = new Schema({ array: Array }) var ExampleSchema3 = new Schema({ array: [ Schema.Types.Mixed ]}) var ExampleSchema4 = new Schema({ array: [{ }] }) ``` #### 2.3 附言 * `Schema` 不仅定义了文档结构和使用性能,还可以有扩展插件、实例方法、静态方法、复合索引、文档生命周期钩子 * `Schema` 可以定义插件,并且插件具有良好的可拔插性, `Schema#add`, `Schema#set`, `Schema#static` ... ### 3 Schema 扩展 #### 3.1 实例方法 > 我们创造的 `Schema` 不仅要为后面的 `Model` 和 `Entity` 提供公共的属性,还要提供公共的方法。 ```js var PersonSchema = new Schema({ name: String, type: String }) //查询类似数据 PersonSchema.methods.findSimilarTypes = function(cb) { return this.model('Person').find({ type: this.type }, cb) } var PersonModel = mongoose.model('Person', PersonSchema) var krouky = new PersonSchema({ name: 'krouky', type: '前端工程师' }) krouky.findSimilarTypes(function(err, persons) { //persons中就能查询到其他前端工程师 }) ``` #### 3.2 静态方法 > 静态方法可以在 `model` 层使用 ```js PersonSchema.statics.findByName = function(name, cb) { this.find({ name: new RegExp(name, 'i'), cb }) } var PersonModel = mongoose.model('Person', PersonSchema) PersonModel.findByName('krouky', function(err, persons) { //找到所有名字叫krouky的人 }) ``` #### 3.3 索引 > 索引或者复合索引能让搜索更加高效,默认索引就是主键索引 `ObjectId`,属性名为 `_id` ,或者使用 `index: true` 来创建索引。 #### 3.4 虚拟属性 > `Schema` 中如果定义了虚拟属性,那么该属性将不写入数据库 ```js var PersonSchema = new Schema({ name: { first: String, last: String } }) var PersonModel = mongoose.model('Person', PersonSchema) var krouky = new PersonModel({ name:{ first: 'krouky', last: 'han' } }) ``` * 这个时候就可以使用虚拟属性 ```js PersonSchema.virtual('name.full').get(function() { return this.name.first + ' ' + this.name.last }) ``` * 那么就能用 `krouky.name.full` 来调用全名了,反之如果知道 `full`,也可以反解 `first` 和 `last` 属性 ```js PersonSchema.virtual('name.full').set(function(name) { var split = name.split(' ') this.name.first = split[0] this.name.last = split[1] }); var PersonModel = mongoose.model('Person', PersonSchema) var krouky = new PersonModel({}) krouky.name.full = 'krouky han' //会被自动分解 console.log(krouky.name.first) //krouky ``` #### 3.5 配置项 * 在使用 `new Schema(config)` 时,我们可以追加一个参数 `options` 来配置 `Schema` 的配置 ```js var ExampleSchema = new Schema(config, options) // 或者使用 var ExampleSchema = new Schema(config) ExampleSchema.set(option, value) ``` ##### options * `timestamps: true`:自定义生成 创建时间 & 更新时间 [接口返回格式参考](https://fastmock.site/#/project/32586dc72671b593544e5d191ada0b88)