我创建了一个接收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);
}
有没有办法使用事件来实现这个目标?
或者我需要其他设计吗?