簡體   English   中英

node.js和路由:按類發出

[英]node.js and routing: emit by class

新手問題如下:

我很難讓EventEmitter正常工作。 我已經考慮過文檔和類似這樣的一些最佳實踐教程: https : //code.tutsplus.com/tutorials/managing-the-asynchronous-nature-of-nodejs--net-36183

問題是,在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(路由)

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;

這很簡單,您在User函數中忘記了EventEmiter.call(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;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM