求Nodejs 服务端model推荐
求Nodejs 服务端model推荐
现有一个需求,服务端需要一个类似backbone.model的模型。该模型能够检测对象属性的变化。 看了backbone,但是每次都只能调用set,get之类的方法。 各位达人,有没有好点地内存model推荐啊?
注:不是要ORM的那种哈
当然可以!如果你正在寻找一个类似于 Backbone.Model 的模型来处理对象属性变化,并且希望它能够自动检测这些变化,那么你可以考虑使用 mobx
或 immer
这样的库。这两个库都提供了强大的状态管理和响应式系统,非常适合你的需求。
使用 MobX
MobX 是一个非常流行的库,它可以让你的对象变得响应式。你可以定义一个可观察的对象,并通过装饰器或者函数来定义这些对象的属性。当属性发生变化时,MobX 会自动通知所有依赖于这些属性的地方。
示例代码
import { makeObservable, observable, action } from 'mobx';
class MyModel {
constructor() {
makeObservable(this, {
name: observable,
setName: action
});
}
name = '';
setName(newName) {
this.name = newName;
}
}
const model = new MyModel();
model.setName('John Doe');
model.name; // "John Doe"
model.setName('Jane Doe');
model.name; // "Jane Doe"
在这个例子中,我们定义了一个 MyModel
类,并使用 makeObservable
来使 name
属性变为可观察的。setName
方法是一个动作,用于更改 name
属性的值。当你调用 setName
方法时,MobX 会自动检测到 name
属性的变化并通知所有依赖于它的地方。
使用 Immer
Immer 是一个更轻量级的库,主要用于处理不可变数据结构。虽然它本身不提供响应式系统,但你可以结合其他库(如 React 或 Vue)来实现响应式更新。
示例代码
import produce from 'immer';
class MyModel {
constructor(initialState) {
this.state = initialState;
}
setName(newName) {
this.state = produce(this.state, draft => {
draft.name = newName;
});
}
getName() {
return this.state.name;
}
}
const model = new MyModel({ name: '' });
model.setName('John Doe');
model.getName(); // "John Doe"
model.setName('Jane Doe');
model.getName(); // "Jane Doe"
在这个例子中,我们定义了一个 MyModel
类,并使用 produce
函数来创建一个新的状态对象,其中包含修改后的 name
属性。每次调用 setName
方法时,都会生成一个新的状态对象,从而保持数据的不可变性。
希望这些示例代码能帮助你找到合适的解决方案!
自己搞嘛。。。用Object.defineProperty。。。
针对你的需求,可以考虑使用 mobx-state-tree
或者 immer
结合 class-validator
来实现一个可观察、可验证的对象模型。
使用 mobx-state-tree
mobx-state-tree
是一个强大的状态管理库,同时也非常适合用来创建具有数据校验功能的可观察模型。
示例代码
首先安装 mobx-state-tree
:
npm install mobx-state-tree
然后创建一个模型:
const { types, onSnapshot } = require('mobx-state-tree');
const MyModel = types.model({
name: types.string,
age: types.number,
}).actions(self => ({
setName(name) {
self.name = name;
},
setAge(age) {
self.age = age;
},
}));
const instance = MyModel.create({ name: 'John Doe', age: 30 });
// 监听模型变化
onSnapshot(instance, (snapshot) => {
console.log('Snapshot:', snapshot);
});
instance.setName('Jane Doe');
instance.setAge(25);
console.log(instance);
使用 immer
和 class-validator
immer
可以帮助我们实现不可变的数据更新,而 class-validator
可以提供数据校验功能。
示例代码
首先安装依赖:
npm install immer class-validator class-validator-class-decorator
然后定义一个模型类:
const { createMachine } = require('immer');
const { validateOrReject } = require('class-validator');
const { plainToClass } = require('class-transformer');
class MyModel {
@IsString()
name;
@IsInt()
age;
setName(name) {
const nextState = createMachine(this, draft => {
draft.name = name;
});
this.name = nextState.name;
}
setAge(age) {
const nextState = createMachine(this, draft => {
draft.age = age;
});
this.age = nextState.age;
}
}
const instance = new MyModel();
instance.name = 'John Doe';
instance.age = 30;
validateOrReject(plainToClass(MyModel, instance))
.then(() => {
console.log('Validation successful!');
})
.catch(errors => {
console.error('Validation errors:', errors);
});
instance.setName('Jane Doe');
instance.setAge(25);
console.log(instance);
总结
这两种方法都可以满足你的需求,使用 mobx-state-tree
可以更方便地进行状态管理和监听变化,而使用 immer
和 class-validator
则更适合那些希望结合类型安全和数据校验的开发者。