node.js和routing:按类发出

新手问题如下:

我很难让EventEmitter工作。 我已经考虑过这样的文档和几个最好的教程: https : //code.tutsplus.com/tutorials/managing-the-asynchronous-nature-of-nodejs-net-36183

问题是,在user.js(Class)this.emit()中没有任何结果。 userRoutes.js不触发任何user.on(),我真的不知道为什么..

任何build议表示赞赏。 提示更好的结构也。 我的目标是集中端点(可读性强),并在不同模块中重用每个模块(如用户或产品/订单)的代码,例如调用更新用户端点的订单。

所以,假设你有一个模块configuration的node.js-Server,路由器和几个类,如下所示:

/server.js

global.__base = __dirname + "/"; var server = require("http").createServer(); var routes = require("./v2"); var initialize = require(global.__base + "config"); var app = initialize.globalModules(); app.use('/api/v2', routes); app.listen('8090'); 

/config.js

 var db; module.exports = { globalModules: function() { // load the global modules var app = require("express")(); var bodyParser = require("body-parser"); //setUp app app.use(bodyParser.json()); return app; }, db: function() { var mysql = require('mysql'); var db = mysql.createConnection({ host: 'localhost', user: 'root', password: '', database: 'node_docx' }); db.connect(function(err) { if (err) throw err; }); return db; } }; 

/v2/index.js(路线)

 var userRoutes = require('./userRoutes'); var routes = require('express').Router(); routes.use("/user", userRoutes); //routes.use("/product", productRoutes); //routes.use("/order", orderRoutes); //... routes.use('*', function(req, res) { res.status(404).send({code: 404, message: 'ERR', data: "Unknown target."}); }); module.exports = routes; 

/v2/userRoutes.js

 var User = require("./routes/user.js"); var user = new User(); var route = require('express').Router(); route.get("/", function(req, res) { user.on('error', function(err) { res.status(400).send({code: 900, message: 'ERR', data: err}); }); user.on('failure', function() { res.status(404).send({code: 901, message: 'ERR', data: "User not found!"}); }); user.on('success', function(result) { res.status(200).send({code: 200, message: 'OK', data: result}); }); user.getAll(); }); module.exports = route; 

/v2/routes/user.js

 var util = require('util'); var EventEmitter = require('events').EventEmitter; var initialize = require(global.__base + "/config"); var db = initialize.db(); function User() { EventEmitter.call(this); //edit: added, but has not solved the problem var self = this; //solved it! function _checkForErrors(error, rows, reason) { if (error) { self.emit('error', error); return true; } if (rows.length < 1) { self.emit('failure', reason); return true; } return false; } function _getData(error, rows) { if (_checkForErrors(error, rows)) { return false; } else { self.emit('success', rows); } } function getAll() { db.query("SELECT * FROM patient", _getData); } this.getAll = getAll; } util.inherits(User, EventEmitter); module.exports = User; 

这很简单,你忘记EventEmiter.call(this)函数User

 function User() { EventEmitter.call(this); var self = this; function _checkForErrors(error, rows, reason) { if (error) { self.emit('error', error); return true; } if (rows.length < 1) { self.emit('failure', reason); return true; } return false; } function _getData(error, rows) { if (_checkForErrors(error, rows)) { return false; } else { self.emit('success', rows); } } function getAll() { db.query("SELECT * FROM patient", _getData); } this.getAll = getAll; }