node.js - mongodb 和 EventEmitter 之间的问题

标签 node.js mongodb

我在 node-mongodb-native 和 EventEmitter 之间遇到了一个奇怪的问题。

我已将问题简化为以下代码:

var mongodb = require( 'mongodb' ),
    Server = mongodb.Server,
    Db = mongodb.Db,
    events = require( 'events' ).EventEmitter.prototype;

// Create a mongo client object
var client = new Db( 'tartempion',
    new Server(
        '127.0.0.1',
        27017
    )
);

// Open the connection
client.open( function( err, db ) {
    if ( err ) throw err;
    database = db;
    console.log( 'Database driver loaded.' );
    events.emit( 'hi' );
});

// If I comment this out, I don't get the error anymore
// and the "Database driver loaded." log is displayed.
events.on( 'hi', function() {
    console.log( 'hey man' );
});

我收到此错误:

net.js:140
    // Uncomment the following lines after libuv backend is stable and API
      ^
RangeError: Maximum call stack size exceeded

我认为这可能与回调中的事件有关,但此代码有效:

events.on( 'hi', function() {
    console.log( 'hey man' );
});

f( function() {
    events.emit( 'hi' );
});

function f( callback ) {
    callback();
}

所以...我不知道问题出在哪里。

仅供引用,我将其交叉发布在node-mongodb-native issue queue上.

最佳答案

如果你说:

events = require( 'events' ).EventEmitter.prototype;
event.on('foo');

您是在自找麻烦,因为每个事件对象都会获得此绑定(bind)(因为您将其写入所有事件的基本原型(prototype))...

最好(如 Jonathon 所说)实例化一个新对象来绑定(bind)事件......

sharedEventEmitter.js

var events = require('events');
var eventEmitter = new events.EventEmitter();
module.exports = eventEmitter;

现在,从项目的其余部分 - 您可以将其视为单例 - 一个将向任何监听的对象发出事件的对象 - 每次您 require('sharedEventEmitter') 时,您都会得到相同的实例(它是单例):

a.js

var sharedEvents = require('./sharedEventEmitter');
sharedEvents.on('foo', function(st){
  console.log(st);
})

b.js

var sharedEvents = require('./sharedEventEmitter');
sharedEvents.emit('hello from another file');

关于node.js - mongodb 和 EventEmitter 之间的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11991781/

相关文章:

javascript - mongodb 如果存在则递增,否则插入

node.js - sequelize postgres 批量插入忽略如果存在

mysql - Sequelize 关联为一个模型创建 userId 和 user_id,但不为另一个模型创建 userId 和 user_id

javascript - 为什么 Node fs.watchFile 使测试无法完成?

javascript - 使用 Node 请求模块的 UTF8 字符编码

javascript - 最快的 JavaScript 重定向

java - 如何使用 MongoDB Java 驱动程序将 Bson 序列写入文件

javascript - Node.js/Sockets - 用户连接时,它会加载之前的消息,但会将消息加载到所有其他聊天用户,而不是刚刚连接的用户

node.js - 使用 $min 选择字段的最小值并在 mongodb 中聚合

javascript - Mongoose:递归迭代以更新树状结构中的属性