我有一个快速应用程序,它有一个路由器,用于我的应用程序的不同部分,每个部分包含在单个文件中。在每个文件的末尾,我像这样导出路由器对象。
var express = require("express");
var router = express.Router();
//routing handlers
module.exports = router;
但是我的问题是我试图实现一个功能,允许用户编辑可以在首页上显示的帖子,因此为了拥有用户帖子的最新版本我需要能够知道用户何时编辑帖子以进行必要的更改。
我有两个模块,一个处理调度用户的帖子调用这个模块B和另一个处理编辑调用这个模块A.我需要能够让模块A包含处理函数和一个来自模块B的数组,但我也是需要模块B能够在何时更改模块A所需的阵列时收到通知。
我试过了
module A
var express = require('express');
var EventEmitter = require('events').EventEmitter;
var evt = new EventEmitter();
var router = express.Router();
var modB = require('moduleB');
router.evt = evt;
module.exports = router;
Module B
var express = require('express');
var router = express.Router();
var modA = require('moduleA').evt;
modA.on('myEvent',handler);
var myArray = [....];
router.myArray = myArray;
module.exports = router;
这给了我一个未定义的modA并抛出一个错误。我怀疑它可能是包含模块的顺序,但无论如何我想获得一些反馈,因为我觉得这可能不是一个好的做法。
答案 0 :(得分:1)
我认为你正在遇到一个刚开始使用快递的人。很多人把所有东西都粘在路线/控制器上,真正的路线应该非常简单,只需要提取所需的数据,找出请求的作用,然后将其传递给服务进行大部分处理。
解决方案是创建一个服务并将大量逻辑和公共代码放在那里,然后您可以根据需要连接ModA和ModB以使用服务。
编辑一个例子(不工作,但应该给你一个很好的起点):
共享服务
var EventEmitter = require('events').EventEmitter;
var evt = new EventEmitter();
module.exports = {
saveData: function(data) {
// do some saving stuff then trigger the event
evt.emit('myEvent', data);
},
onDataChange: function(handler) {
evt.on('myEvent', handler);
}
};
模块A
var service = require('SharedService.js');
// listen for events
service.onDataChange(function(e, data) {
// do something with the data
});
模块B
var service = require('SharedService.js');
// save some data which will cause Module A's listener to fire
service.saveData(data);
上面的这个例子隐藏了EventEmitter的实现,它可能是也可能不是。另一种方法是让SharedService扩展EventEmitter,然后你的模块可以直接在服务上监听/发出。