NodeJS双向(内部)事件

时间:2017-02-10 10:00:47

标签: javascript node.js

我创建了一个接收HTTP GET请求的简单类,并在事件中发出路径名和查询。

这个想法是可以做一个get请求,例如:' example.com/lightControl?id = 1& state = true'设置一个灯。

然而,还应该能够通过简单地执行以下请求来请求灯的当前状态:' example.com/lightControl?id = 1'

let http = require('http');
let url = require('url');
let EventEmitter = require("events").EventEmitter;

class Api extends EventEmitter{
    constructor(port){
    super();
    this.startServer(port);
    }
  startServer(port){
    this.server = http.createServer(this.handleRequest);
    this.server.listen(port, function(){
      //Callback triggered when server is successfully listening. Hurray!
      console.log("Server listening on port:", port);
    });
  }
  handleRequest(request, response){
    //console.log("URL",request.url);
    var parsed = url.parse(request.url,true);
    this.emit('request',parsed.pathname,parsed.query);
    response.end('API called: \n\nPath:   ' + JSON.stringify(parsed.pathname) + "\nValues: " + JSON.stringify(parsed.query));
  }   
}

目前,我的代码通过声明路径名和查询来响应请求。但我希望它回应光的实际状态。

问题是,我使用的是事件总线。所有连接的设备都可以发送事件,然后另一个设备可以对其进行操作,但没有直接响应消息。从理论上讲,它可以发送一个响应事件,但是我需要一种方法来跳回到handleRequest函数并从发出事件的地方完成它?

我认为事件总线的异步和松散耦合属性并不真正支持这样的要求。

我可以到处做这样的事情(见下文),但这会打破消息总线的整个原则。

handleRequest(request, response){
    //console.log('URL',request.url);
    var parsed = url.parse(request.url,true);
    deviceHandler.setDevice(parsed.pathname,parsed.query);
    var state = deviceHandler.getDeviceState(parsed.pathname);
    response.end('Device: ' + parsed.pathname + ' is now: ' + state);
  }

有没有办法使用事件来实现这个目标?

或者我需要其他设计吗?

0 个答案:

没有答案