2017-02-23 3 views
1

newbie Frage ist folgende:node.js und Routing: emittieren nach Klasse

Ich bin eine harte Zeit, die EventEmitter zur Arbeit zu kommen. Ich habe bereits die Dokumentation und mehrere Best-Practice-Tutorials wie dieses betrachtet: https://code.tutsplus.com/tutorials/managing-the-asynchronous-nature-of-nodejs--net-36183

Das Problem ist, dass innerhalb der user.js (Class) this.emit() nichts trifft. userRoutes.js löst keine user.on() aus, und ich weiß wirklich nicht warum.

Irgendwelche Vorschläge werden geschätzt. Hinweise für eine bessere Strukturierung. Meine Ziele sind zentralisierte Endpunkte (gut lesbar) und die Wiederverwendung des Codes für jedes Modul (wie Benutzer oder Produkte/Bestellungen) innerhalb verschiedener Module, z. Aufruf, um einen Auftrag aus dem Benutzerendpunkt zu aktualisieren. So

, nehmen wir an, Sie haben Ihre node.js-Server mit einer Modulkonfiguration, Router und mehrere Klassen, wie folgt aus:

/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 (Routen)

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; 

Antwort

2

Es ist ganz einfach, Sie EventEmiter.call(this) in Funktion User vergessen.

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; 

} 
+0

danke für Ihre Antwort, aber user.on ('Erfolg', ...); triggert immernoch :( – corax228

+1

Versuche es jetzt. Du hast auch vergessen "var self = this". –

+0

ok jetzt bin ich etwas verwirrt ... wenn ich mit diesem selbst übergehe, warum funktioniert self.emit(); this.emit() nicht?! btw: danke dafür !! – corax228

Verwandte Themen