Javascript node.js和路由:按类发射
新手问题如下: 我很难让EventEmitter正常工作。我已经考虑过文档和一些最佳实践教程,比如: 问题是,在user.js(类)中,this.emit()不会命中任何内容。userRoutes.js不会触发任何user.on(),我真的不知道为什么 如有任何建议,我们将不胜感激。还有更好的结构设计提示。我的目标是集中化端点(可读性好),并在不同模块内重用每个模块(如用户或产品/订单)的代码,例如,调用用户端点更新订单 因此,假设您的node.js-Server具有模块配置、路由器和几个类,如下所示: /server.jsJavascript node.js和路由:按类发射,javascript,node.js,api,event-handling,Javascript,Node.js,Api,Event Handling,新手问题如下: 我很难让EventEmitter正常工作。我已经考虑过文档和一些最佳实践教程,比如: 问题是,在user.js(类)中,this.emit()不会命中任何内容。userRoutes.js不会触发任何user.on(),我真的不知道为什么 如有任何建议,我们将不胜感激。还有更好的结构设计提示。我的目标是集中化端点(可读性好),并在不同模块内重用每个模块(如用户或产品/订单)的代码,例如,调用用户端点更新订单 因此,假设您的node.js-Server具有模块配置、路由器和几个类,如
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(路由)
/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;
var util=require('util');
var EventEmitter=require('events')。EventEmitter;
var initialize=require(全局._ubase+“/config”);
var db=initialize.db();
函数用户(){
EventEmitter.call(this);//编辑:已添加,但尚未解决问题
var self=this;//解决了它!
函数检查错误(错误、行、原因){
如果(错误){
self.emit('error',error);
返回true;
}
如果(行数长度<1){
自我释放(“失败”,原因);
返回true;
}
返回false;
}
函数_getData(错误,行){
如果(_checkForErrors(error,rows)){
返回false;
}否则{
self.emit('success',行);
}
}
函数getAll(){
db.query(“从患者中选择*”,_getData);
}
this.getAll=getAll;
}
继承(用户、EventEmitter);
module.exports=用户;
非常简单,您忘记了eventemitter。在函数User
中调用(this)
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;
}
函数用户(){
EventEmitter.call(this);
var self=这个;
函数检查错误(错误、行、原因){
如果(错误){
self.emit('error',error);
返回true;
}
如果(行数长度<1){
自我释放(“失败”,原因);
返回true;
}
返回false;
}
函数_getData(错误,行){
如果(_checkForErrors(error,rows)){
返回false;
}否则{
self.emit('success',行);
}
}
函数getAll(){
db.query(“从患者中选择*”,_getData);
}
this.getAll=getAll;
}
谢谢您的回答,但是user.on('success',…);仍然不会触发:(现在试试。您还忘记了var self=this
。好吧,现在我有点困惑……如果我用这个过度估计self,为什么self.emit()可以工作,而this.emit()呢不是吗?!顺便说一句:谢谢你!!没关系…self
有另一个上下文,而不是函数中的this
。。谢谢,我是盲人:Dthx,最后一个问题:这是一种常见的(好的)方法吗?
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;
}