私は最近、React-Redux-Express-Mongooseスタックを使用していくつかの等身大/ユニバーサルプロジェクトを構築しました。同形(React/Redux/Express/Mongo)アプリケーションのデータモデルとビジネスロジック
私のマングースモデルには、多くのビジネスロジックが含まれています。非常に基本的な例(言い訳私のES6)のよう:
import mongoose, {Schema} from 'mongoose';
const UserSchema = new Schema({
name: String,
password: String,
role: String
});
UserSchema.methods.canDoSomeBusinessLogic = function(){
return this.name === 'Jeff';
};
UserSchema.methods.isAdmin = function(){
return this.role === 'admin';
};
これは、これらのモデルは、プレーンなJSONオブジェクトとしてブラウザで水和されているがとき、サーバー上のすべての素晴らしいですが、私は、この同じビジネスを再実装する必要がありますある種のReactコンポーネントやRedux Reduceのロジックがあります。私はこれに最も近づける方法が不思議です。
Mongooseを読んでいることから、ブラウザのサポートは限られているようです。私の主なオプションは次のとおりです:
すべてのビジネスロジックをいくつかの「通常の」JSクラスに移動し、それらをすべてその場でインスタンス化します。たとえば:
# JS Class definition - classes/user.js export default class User { constructor(data = {}){ Object.assign(this,data); } canDoSomeBusinessLogic(){ return this.name === 'Jeff'; }; isAdmin(){ return this.role === 'admin'; } } # Server - api/controllers/user.js import UserClass from User.findById(1,function(err,user){ let user = new UserClass(user.toJSON(); }); # Client - reducers/User.js export default function authReducer(state = null, action) { switch (action.type) { case GET_USER: return new UserClass(action.response.data); } } # Client - containers/Page.jsx import {connect} from 'react-redux'; @connect(state => ({user: state.user})) export default class Page extends React.Component { render(){ if(this.props.user.isAdmin()){ // Some admin } } }
は、いくつかの静的なヘルパー関数にすべてのビジネスロジックを移動します。私は基本的に再び全体の一例を書き出すはなくなります。
# helpers/user.js export function isAdmin(user){ return user.role === 'admin'; }
を私は上記の2の違いは、単に個人的な好みであると仮定します。しかし、同型アプリやデータモデリングについて他の誰かが考えている人はいますか?あるいは、この問題を解決する人々のオープンソースの例を見たことがあります。
上記の拡張として、isomorphic save()関数はどうでしょうか? User.save()。したがって、クライアント上で呼び出された場合、関連するAPIエンドポイントにPOSTを実行し、サーバー上で実行すると、Mongoose save()関数を呼び出します。