Ich habe vor kurzem ein paar isomporphen/universellen Projekten mit dem React-Redux-Express-Mongoose-Stack gebaut.Datenmodelle und Geschäftslogik in isomorpher (React/Redux/Express/Mongo) App
In meinen Mungo-Modellen steckt viel Business-Logik. Als sehr einfaches Beispiel (entschuldigen Sie meine 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';
};
Dies alles toll auf dem Server ist jedoch, wenn diese Modelle im Browser als Ebene JSON-Objekte mit Feuchtigkeit versorgt werden, muss ich dann das gleiche Geschäft neu implementieren Logik in einigen React-Komponenten oder Redux Reducer, die sich für mich nicht sehr sauber anfühlen. Ich frage mich, wie ich das am besten angehen kann.
Beim Lesen von Mongoose scheint die Browser-Unterstützung begrenzt zu sein, meistens nur für die Überprüfung von Dokumenten. Ich nehme meine wichtigsten Optionen sind:
Verschieben Sie alle Business-Logik in einige „normale“ JS-Klassen und alle über dem Platz instanziiert. Zum Beispiel:
# 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 } } }
Verschieben Sie alle Business-Logik in einem einige statische Hilfsfunktionen. Ich werde nicht wieder die ganze Beispiel schreiben, aber im Wesentlichen:
# helpers/user.js export function isAdmin(user){ return user.role === 'admin'; }
Ich nehme an, den Unterschied zwischen dem obigen 2 ist nur eine persönliche Vorliebe. Aber hat jemand andere Gedanken über isomorphe Apps und Datenmodellierung? Oder ich habe ein Open-Source-Beispiel von Leuten gesehen, die dieses Problem lösen.
Als eine Erweiterung des oben genannten, was ist mit einer isomorphen save() - Funktion, z. User.save(). Wenn es also auf dem Client aufgerufen wird, könnte es einen POST zu dem relevanten API-Endpunkt ausführen, und wenn es auf dem Server ausgeführt würde, würde es die Mongoose-Funktion save() aufrufen.