事件发射器发射一次,请求挂起
EventEmiter Fire Once, Request Pends After
我正在尝试在这个平台上制作我的第一个应用程序时,用express访问nodejs。在图片上的这个代码上,我是来自帖子请求的,我正在尝试检查发送给我的userData是否已经注册。否则,它将注册用户。为了尽量减少回调,我将使用事件来告诉我调用的函数是否完成。在这种情况下,如果checkUser函数属性在图像的右侧,如果db找到了用户,它将发出写在左侧的userAuthenticated
事件。如果不是,它将写入用户并发出userRegistered
事件。
问题是,有时它有效,有时它不起作用。这是我第一次在node上编写异步函数,我对它的工作方式感到困惑。
- 代码-http://prntscr.com/9h2qr2
- 浏览器出错-http://prntscr.com/9h2szw
- 节点中出错-http://prntscr.com/9h2t81
问题是在发送响应后没有删除事件处理程序。on()
保留事件处理程序,直到它们被显式删除。因此,对于每个连接,都会添加新的事件处理程序,但从未删除。
即使您使用.once()
而不是.on()
,您仍然需要删除其他未激发事件的处理程序。
IMHO您最好只使用一个回调,而不是使用EventEmitter使事情复杂化。例如:
models/authenticate.js:
// ...
exports.checkUser = function(data, cb) {
UsersDB.findOne({ fbid: data.id }, function(err, doc) {
if (err)
return cb(err);
if (doc === null)
insertUser(data, cb);
else
cb(null, 'Authenticated', doc);
});
};
var insertUser = exports.insertUser = function(data, cb) {
var insertData = {
fbid: data.id
first_name: data.first_name
last_name: data.last_name,
email: data.email,
created_at: new Date()
};
UsersDB.insert(insertData, function(err, doc) {
if (err)
return cb(err);
cb(null, 'Registered', doc);
});
};
controllers/authenticate.js:
// ...
model.authenticate(req.body, function(err, action, data) {
if (err)
return res.json({ error: err });
res.json({ action: action, userData: data });
});
此外,您可以简化"检查并插入"逻辑,使用MongoDB的"upstart"功能,该功能将为您执行这两个步骤,而不是两个单独的数据库调用。要了解如何做到这一点,请查看这个SO答案。
相关文章:
- 在Flask中使用.getJSON请求时,只运行一次命令
- 优化的方法;标题“;只发送一次POST请求即可访问网站
- http请求,每500ms一次,直到请求完成Angular
- 多久向服务器发送一次Http请求以检查更新?(Ajax)
- 如何在节点中使用承诺一次并行异步多个请求
- 授权标头仅在 AJAX CORS 请求中追加一次
- 为什么将 ng-select 替换为自定义指令会导致$http请求不会每隔一段时间发送一次
- AJAX 请求触发 4 次而不是一次
- AJAX 请求只发生一次(PHP 表单请求)
- 如何删除浏览器在一次请求期间添加的所有 Cookie
- 在每秒 10 次调用限制的情况下一次发出 50 个 API 请求的有效方法是什么(烂番茄 API)
- 使用RxJS限制一次的请求数
- Ajax iframe请求在Internet Explorer中只能工作一次
- 事件发射器发射一次,请求挂起
- 如何获得用户's的位置,而无需请求许可,或者如果用户允许一次,则无需再请求
- 为什么我的页面中的AJAX请求只工作一次
- Jquery Queue请求集成一次First Request Success,然后调用下一个请求
- 我们可以访问主流HTML页面中浏览器下一次请求的URL吗;s卸载功能
- 使用angularjs在一次请求中发布迭代数据
- 如何让jquery每30秒向php脚本发布一次请求