मैंने हाल ही में रिएक्ट-रेडक्स-एक्सप्रेस-मोंगोस स्टैक का उपयोग करके कुछ आइसोमोर्फिक/यूनिवर्सल प्रोजेक्ट्स का निर्माण किया है।आइसोमोर्फिक में डेटा मॉडल और व्यावसायिक तर्क (प्रतिक्रिया/रेडक्स/एक्सप्रेस/मोंगो) ऐप
मेरे मोंगोज़ मॉडल में बहुत सारे व्यवसाय-तर्क शामिल हैं। एक बहुत ही बुनियादी उदाहरण (बहाना मेरी 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 ऑब्जेक्ट के रूप ब्राउज़र में हाइड्रेटेड हैं, मैं तो यह एक ही व्यवसाय को फिर से लागू करने के लिए है कुछ प्रतिक्रिया घटक या रेडक्स reducer में तर्क, जो मुझे बहुत साफ महसूस नहीं करता है। मैं सोच रहा हूं कि इस तक कैसे पहुंचे।
मोंगोस के आसपास पढ़ने से, ब्राउज़र प्रमाणीकरण के लिए सीमित ब्राउज़र समर्थन लगता है। कुछ "सामान्य" जे एस वर्गों में
ले जाएँ सभी व्यापार तर्क है, और हर जगह उन का दृष्टांत: मुझे लगता है कि मेरी मुख्य विकल्प हैं। उदाहरण के लिए:
# 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 के बीच अंतर लगता है सिर्फ व्यक्तिगत वरीयता है। लेकिन क्या किसी के पास आइसोमोर्फिक ऐप्स और डेटा मॉडलिंग के बारे में कोई अन्य विचार है? या इस समस्या को हल करने वाले लोगों का कोई खुला स्रोत उदाहरण देखा है।
उपरोक्त के विस्तार के रूप में, एक आइसोमोर्फिक सेव() फ़ंक्शन उदा। User.save()। इसलिए यदि क्लाइंट पर कॉल किया गया तो यह प्रासंगिक एपीआई एंडपॉइंट पर एक पोस्ट कर सकता है, और यदि सर्वर पर चलाया जाता है तो यह मोंगोस सेव() फ़ंक्शन को कॉल करेगा।