gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:59:31 25 4
gpt4 key购买 nike

我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com