Javascript 流星与咒语。交叉关注点

Javascript 流星与咒语。交叉关注点,javascript,meteor,jsx,cross-cutting-concerns,Javascript,Meteor,Jsx,Cross Cutting Concerns,我正在开发应用程序在流星与咒语。这是用户模块的routes.jsx。我希望能够在其他模块的操作和路由中使用requireLogin和redirectUsers。或者一般来说,我如何在不违反mantra架构的情况下处理交叉关注点 import React from 'react'; import {mount} from 'react-mounter'; import Login from './containers/login'; import Register from './contain

我正在开发应用程序在流星与咒语。这是
用户
模块的routes.jsx。我希望能够在其他模块的操作和路由中使用
requireLogin
redirectUsers
。或者一般来说,我如何在不违反mantra架构的情况下处理交叉关注点

import React from 'react';
import {mount} from 'react-mounter';

import Login from './containers/login';
import Register from './containers/register';
import App from '/client/modules/core/components/app.jsx';

export default function (injectDeps,{FlowRouter,Meteor,LocalState}) {
  let userRoutes = FlowRouter.group({
    prefix:'/user',
    name:'user'
  });

  const AppCtx = injectDeps(App);

  const redirectUsers = () => {
      if(Meteor.userId()){
        const path = LocalState.get('INTERRUPTED_REQUEST_PATH')
          ? LocalState.get('INTERRUPTED_REQUEST_PATH') : '/joke/';
        FlowRouter.go(path);
        return;
      }
  }

  const requireLogin = (path) => {
      if(!Meteor.userId()){
          LocalState.set('INTERRUPTED_REQUEST_PATH',path);
          FlowRouter.go('/user/login');
        return;
      }
  }

  userRoutes.route('/', {
    triggersEnter: [(context,redirect) => {
      if(!Meteor.userId()){
         requireLogin('/user/login');
      }
    }],
    action() {
    }
  });

  userRoutes.route('/login',{
    triggersEnter: [(context,redirect) => {
      redirectUsers();
    }],
    action() {
      mount(AppCtx, { 
        content: () => (<Login />)
      });
    }
  });
}
从“React”导入React;
从'react mounter'导入{mount};
从“./containers/Login”导入登录名;
从“./容器/寄存器”导入寄存器;
从“/client/modules/core/components/App.jsx”导入应用程序;
导出默认函数(injectDeps,{FlowRouter,Meteor,LocalState}){
让userRoutes=FlowRouter.group({
前缀:'/user',
名称:'user'
});
const AppCtx=注入deps(App);
常量重定向用户=()=>{
if(Meteor.userId()){
const path=LocalState.get('INTERRUPTED\u REQUEST\u path')
?LocalState.get('INTERRUPTED_REQUEST_PATH'):'/joke/';
FlowRouter.go(路径);
返回;
}
}
const requireLogin=(路径)=>{
如果(!Meteor.userId()){
set('INTERRUPTED\u REQUEST\u PATH',PATH);
go('/user/login');
返回;
}
}
userRoutes.route(“/”{
triggersEnter:[(上下文,重定向)=>{
如果(!Meteor.userId()){
requireLogin('/user/login');
}
}],
行动(){
}
});
userRoutes.route(“/login”{
triggersEnter:[(上下文,重定向)=>{
重定向用户();
}],
行动(){
挂载(AppCtx,{
内容:()=>()
});
}
});
}

我一直在
/clients/modules/core/libs/
中定义共享函数,并在任何地方使用它。当您在
核心
模块之外使用函数时,我破坏了封装,但我没有找到更好的方法。如果你知道的话,请告诉我

此外,triggersEnter中的重定向和身份验证被视为反模式

下面是我的开源Mantra应用程序中的一个真实例子。见以下几点:

如果你想看到更多,回购协议是可用的


您也可以使用它并在组件级别上处理身份验证。

谢谢,我认为在composer函数中放置横切逻辑并在需要时使用它进行组合是一种非常好的方法。但是操作级别呢?例如,每个用户都可以查看组件,但只有登录的用户才能执行X和Y操作