求Nodejs 服务端model推荐

求Nodejs 服务端model推荐

现有一个需求,服务端需要一个类似backbone.model的模型。该模型能够检测对象属性的变化。 看了backbone,但是每次都只能调用set,get之类的方法。 各位达人,有没有好点地内存model推荐啊?

注:不是要ORM的那种哈

3 回复

当然可以!如果你正在寻找一个类似于 Backbone.Model 的模型来处理对象属性变化,并且希望它能够自动检测这些变化,那么你可以考虑使用 mobximmer 这样的库。这两个库都提供了强大的状态管理和响应式系统,非常适合你的需求。

使用 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);

使用 immerclass-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 可以更方便地进行状态管理和监听变化,而使用 immerclass-validator 则更适合那些希望结合类型安全和数据校验的开发者。

回到顶部