有人可以解释这一点:EventEmitter导致全局variables时失败

我花了一段时间试图诊断这个错误。

首先我创build了一个EventEmitter的子类

文件Client.js

 var bindToProcess = function(fct) { if (fct && process.domain) { return process.domain.bind(fct) } return fct }; function Client(){ EventEmitter.call(this); } util.inherits(Client, EventEmitter); Client.prototype.success = function(fct) { this.on('success', bindToProcess(fct)) return this; } Client.prototype.login = function(username, password) { body = { username : username, password : password }; var self = this; request.post(url, { json:true, body: body }, function (error, response, body) { if (error ||response.statusCode != HTTPStatus.OK ) { return self.emit('error', error); } return self.emit('success', body); }); return this; } module.exports = Client 

然后在我的快速应用程序的另一个文件

文件user.js

 var Client = require('../utils/client'); var client = new Client(); // GET '/login' exports.login = function(req, res){ client.login(username, password).success( function(user) { res.redirect('/'); }).error( function(error) { res.redirect('login'); }); } 

事情是,虽然在第二个请求,服务器崩溃的错误:

错误:发送后无法设置标题。

在此期间,我通过在中间件中创build客户端而不是使其成为全局variables来解决问题。 我只是好奇这是为什么发生?

谢谢,(希望有足够的信息)

这里发生的是第二个请求期间第一个请求对事件处理函数的调用,因为variablesclient在请求之间共享。

起初, client是在全球范围内创build的。 然后两个处理程序被附加到它的事件,然后实际执行请求并调用相应的处理程序。

在第二个请求中,另外两个处理程序被附加到同一个对象上,然后成功或失败地通知两个处理程序(来自之前的调用和来自当前的)。

因此,您需要将客户端创build移动到操作方法,或者更改代码响应事件的方式 – 我可以build议promise类似的方法:将两个callback作为parameter passing给一个方法; 或者只是标准的callback方法:传递错误结果作为callback的第一个参数。