2015-04-26 3 views
0

Привет Я использую redis в приложении node.js для кэширования пользователей. После того, как пользователь выполнил вход в систему, информация пользователя кэшируется и получает доступ к каждому другому запросу, чтобы определить, какой доступ пользователь имеет, и клиент получает информацию, представления и т. Д. На основе этого. Теперь приложение создает redisClient в начале и передает его на необходимые вызовы экспресс-маршрута (что почти все из них). Честно говоря, мне не очень нравится дополнительный аргумент, который передается повсюду - особенно, когда это то же самое. Есть ли лучший способ сделать это, и, например, если я инициализацию redisClient в каждом модуле он будет иметь дополнительные накладныеКлиент Redis в отключенном приложении node.js

var express = require('express'), 
    loginFunctionality = require('./routes/login'), 
    homeFunctionality = require('./routes/home') 
    ... 

// Connect to redis 
var redisClient = redis.createClient(); 
redisClient.on("error", function(err){ 
    console.log("An error occurred with redis:" + err); 
}); 
... 


app.get('/', homeFunctionality.home); 

app.post('/register', loginFunctionality.createNewUser); 

app.post('/login', loginFunctionality.login(redisClient, secret)); 
... 

, что я интересно, если есть хороший способ, чтобы удалить redisClient параметр.

+0

пожалуйста, поместите образец кода ... ваш вопрос не ясно – hussam

ответ

2

Вы можете передать клиенту вместе с каждым запросом через ПО промежуточного слоя:

// initialization 
var client = redis.createClient(...); 

app.use(function(req, res, next) { 
    req.redis = client; 
    next(); 
}); 

// a route handler 
app.get('/', function(req, res) { 
    req.redis.get(...); 
    ... 
}); 

Или, если это применимо, вы можете создать более сложный Связующее ПО, которое будет выполнять сам поиска в кэше и передавать пользовательские данные вместе с запрос, поэтому вам не нужно выполнять поиск в каждом обработчике запросов.

Или вы могли бы переместить инициализацию клиента Redis в отдельный модуль и требуют от каждого из файлов нужно:

// redis-client.js 
var redis = require('redis'); 
module.exports = redis.createClient(...); 

// elsewhere 
var client = require('./redis-client'); 

app.get('/', function(req, res) { 
    client.get(...); 
    ... 
}); 
+0

Все обратные вызовы, которые я использую для маршрутов, находятся в разных модулях: связанный с подключением, связанный с элементом и т. д. Что касается второго предложения, когда вы вызываете его так, как в разных модулях, не будет ли он создавать новый экземпляр для каждого модуля, из которого он был вызван? ? (и если да, не создаст ли он новые соединения) – Dante

+0

Даже если ваши обратные вызовы находятся в разных модулях, они все равно передают объект 'req' (я предполагаю), поэтому они могут использовать' req.red is' (добавление свойств к 'req' - хороший способ распространения материала по цепочке промежуточного программного обеспечения/маршрутизации). Во втором примере используется тот факт, что [модули получают кеширование] (https://nodejs.org/api/modules.html#modules_caching) после первого запроса 'require()' 'd, поэтому все они будут разделять тот же экземпляр клиента Redis. – robertklep

Смежные вопросы