Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js和路由:按类发射_Javascript_Node.js_Api_Event Handling - Fatal编程技术网

Javascript node.js和路由:按类发射

Javascript 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具有模块配置、路由器和几个类,如

新手问题如下:

我很难让EventEmitter正常工作。我已经考虑过文档和一些最佳实践教程,比如:

问题是,在user.js(类)中,this.emit()不会命中任何内容。userRoutes.js不会触发任何user.on(),我真的不知道为什么

如有任何建议,我们将不胜感激。还有更好的结构设计提示。我的目标是集中化端点(可读性好),并在不同模块内重用每个模块(如用户或产品/订单)的代码,例如,调用用户端点更新订单

因此,假设您的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(路由)

/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;

}