Node.js 中对象复用的做法
发布于 11 年前 作者 yuyue007 5116 次浏览 最后一次编辑是 8 年前

我是Java的背景,初入node,对对象复用不是很清楚。

比如,我现在的controller到了两不同的js文件中,文件中都需要用redis的client,我应该怎么处理? **Solution A: **

file1.js:

var redis = require(‘redis’).createClient();

file2.js

var redis = require('redis').createClient();

Solution B: redis.js

var redis = require('redis').createClient(); 

module.exports = redis;

file1.js

var redis = require('./redis'); 

file2.js

var redis = require(’./redis’);

================ 另外我也用到了socket.io,获取io对象采用 var app = require(‘express’)() , server = require(‘http’).createServer(app) , io = require(‘socket.io’).listen(server); 情况也一样,如果我要在两个文件中使用socket.io,难道我要用上面的代码两次么?如果是用两次,那么相当于要创建两个server对象?

请教一个最佳的实战方法。

5 回复

如果你说的对象复用是指在不同模块之间访问同一个对象,那我可以理解为,你需要解决的是模块间的互访。

懒人的方式:使用全局对象 global

file1.js var redis_client = global.redis_client = require(‘redis’).createClient();

纠结但据说更优雅的方式:使用 exports 导出每个模块需要对外的接口

file1.js exports.redis_client = require(‘redis’).createClient();

file2.js var redis_client = require(’./file1.js’).redis_client;

module loading 只发生一次。node 在加载一个module的时候会查是不是已经加载了。

var app = require(‘express’)() , server = require(‘http’).createServer(app) , io = require(‘socket.io’).listen(server);

比如这段代码,如果我在两个文件中都有这段代码,意思是我得到的io是同一个实例?

@yuyue007 不是。多次的require(‘socket.io’)是同一个对象,但是你执行了函数运行,得到的就不是同一个了。require的模块是会被缓存的,多次require同一个模块,这个模块只产生一个实例。如果你需要复用的是模块里的某个变量,那就把这个变量导出,用exports或global导出都行

@wenbob

遇到个非常奇怪的问题。我现在是用的express的标准结构,启动应用是node app.js, 在app.js中,我使用了 exports.channel = io; 或者 global.channel = io; 导出io变量,但是在其他文件中var app = require(’…/app’); 但是使用app.channel的时候说是undefined的。。不知道什么情况

回到顶部