2016-03-01 69 views
3

对于exmple我有这样的代码:将对象传递给NodeJS中的子文件的最佳方法是什么?

var redis = require('redis'); 
var client = redis.createClient(port, host); 

var Stash = require('./lib/stash'); 
var stash = new Stash(data); 

stash.search() 

search方法中包含几个request的在回调,我需要的数据保存到Redis。将client传递给回调函数的最好方法是什么?

Stash.prototype.search = function(search) { 
    var self = this; 

    request(SEARCH_URL + '?' + querystring.stringify(this.params), function (error, response, body) { 
     if (!error && response.statusCode == 200) { 
      // Here i need REDIS 
     } 
    }); 
}; 

通过search方法作为参数,然后添加到回调?基本上我需要在不止一个地方有Redis,所以我需要做的就是像PHP中的静态类。有没有可能或可能在NodeJS有一些具体的技术?

+0

我认为你应该在你的配置级别启动Redis连接。所以像'config.redis'这样的东西永远都是同一个对象,而不是每次都是一个副本或一个新对象。 – Aukhan

回答

1

如果您的search函数是在当前模块中定义的,那么使用客户端将不会有更好的方式,而只是将其定义为模块根级别的变量。

就目前而言,我认为最好的方法是使用Promise。使其搜索方法返回一个承诺,然后在当前模块中定义该承诺的回调。它应该是这样的:

stash.search().then(function(results) { 
    //saveStuff is the made-up function. Use your redis API here to save stuff. If your saving logic was inside the search function before, you were doing something wrong. 
    client.saveStuff(results); 
}) 
.except(function(err) { 
    //This is the reject handler. 
    console.log(err); 
}); 

如果你使用ES6的承诺,寻求方法将是这个样子:

function search() { 
    //Resolve and reject are functions that mark promise as completed successfully or with error respectively. You can pass some data into them. 
    return new Promise(function(resolve, reject) { 
    //This is your async search logic (using request module). 
    request('http://www.google.com', function (error, response, body) { 
     if (!error && response.statusCode == 200) { 
     //You may wanna transform response body somehow. 
     resolve(body); 
     } else { 
     reject(error); 
     } 
    }); 
    }); 
} 

您可以阅读ES6更多信息有望在这里:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

+0

正如我在搜索方法中提到的是https://github.com/request/request,我需要使用'redis'回调,而不是'search'它自己。 – user1564141

+0

此技术与您使用的模块没有任何关系。承诺可以用来简化非常异常的工作。我已经向您展示了您可以在代码中使用它们的最基本方式。 –

+0

所以基本上,当我在回调中调用'resolve(body);'时,它会在我的主文件中调用'then' – user1564141

2

如何在redis上保留所有的操作在一个名为redisoperation.js的独立文件中。

var redis = require('redis'); 
var client; 
exports.init = function init() { 
    if (typeof client === 'undefined') { 
     client = redis.createClient(port, host); 
     client.on("ready", connectionEstablished); 
     client.on("error", connectionError); 
     client.on("end", connectionLost); 
    } 
} 

exports.saveDataToRedis = function (data) { 
    // save data to redis through client 
} 

exports.getDataFromRedis = function (key) { 
    // get data from redis through client 
} 

App.js

// init the redis connection firstly 
var rd = require('./redisoperation.js'); 
rd.init(); 

// other operation on redis through `rd.saveDataToRedis(d)` or `rd.getDataFromRedis(k)` 

也为它要使用redis相关API的其他文件,可能需要redisoperation.js如上,并调用它们。


require doc

模块他们是第一次加载后会被缓存。这意味着(除其他外)每次调用require('foo')时都会返回完全相同的对象,如果它解析为相同的文件。

redisoperation.js没有多个副本作为您的评论指出。

+0

但是在这种方式,我将有多个同一个对象的副本。在我的情况下,我将有11个连接到'Redis',因为我有11个不同的模块。 – user1564141

+0

@ user1564141,你的意思是require('./ redisoperation.js');'可以制作该对象的多个副本?如果是这样,则只需从缓存中获取该对象。 '模块在第一次被加载后被缓存。这意味着(除其他外)每次调用require('foo')将返回完全相同的对象,如果它解析为相同的文件。请参阅此文档[https://nodejs.org /api/modules.html) – zangw

+0

好的,我不知道,但是当我每次调用init时都会执行它中的代码时仍然如此?或者我需要在主文件中调用init来初始化并在子文件中使用set/get方法? – user1564141

相关问题