2012-01-19 13 views
12

Tôi chỉ mới bắt đầu sử dụng một phiên bản mới của Express (2.5.5) mà theo mặc định tạo ra một thư mục ./routes cùng với ./views./publicCách truy cập các biến được khai báo trong app.js chính trong các tệp tuyến đường riêng biệt trong node.js Express 2.5.5?

Bên trong các tuyến đường có một tập tin index.js chứa:

/* 
* GET home page. 
*/ 

exports.index = function(req, res){ 
    res.render('index', { title: 'Express' }) 
}; 

theo mặc định (sau khi chạy express từ dòng lệnh) và đây là phần tuyến đường trong chính app.js:

// Routes 

app.get('/', routes.index); 

tôi đã thiết lập một biến cho một khách hàng redis trong chính app.js:

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

và tôi đã tự hỏi làm thế nào tôi có thể truy cập vào các phương pháp của db (và bất cứ điều gì các module khác tôi require trong app.js) trong các tập tin chứa trong ./routes

+0

tôi don Không biết đây có phải là một thực hành tốt hay không, nhưng bạn có thể có các mô-đun của bạn được bao bọc bên trong một hàm 'exports.init' để lấy các cá thể được chia sẻ làm đối số. Hàm đó sẽ trả về các hàm xuất thực tế và bạn yêu cầu tệp như 'var routes = require (" ./ routes/"). Init (db);'. – pimvdb

Trả lời

21

Tôi thực sự thích giải pháp Jamund, nhưng tôi sẽ mở rộng khái niệm này:

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

// index.js 
var db = require(.'/db') 

// whatever other file 
var db = require(.'/db') 
// do something with db 
db.disconnect(); 

cả db trên chỉ mục và tập tin khác sẽ nhận được cùng một ví dụ của khách hàng redis

+0

Sau đó, bạn có phải xuất mọi chức năng redis mà bạn muốn sử dụng không? ví dụ: redis.set ("một số khóa", "một số val"); hoặc redis.get ("missingkey", chức năng (err, reply) { // reply is null khi khóa bị thiếu console.log (trả lời); }); v.v. – asiammyself

+0

@asiammyself bạn có ý nghĩa gì khi xuất? bạn sẽ có thể gọi 'db.set (key, val)' hoặc 'db.get (key, fn)' từ các tệp khác của bạn. –

+0

như vậy: module.exports {get: redis.get() set: redis.set} nhưng bạn đã làm rõ rằng chúng sẽ hoạt động nên không phải lo lắng. – asiammyself

5

Chỉ cần gọi điều này ở đầu tệp của bạn. Yêu cầu nằm trong một không gian dùng chung, vì vậy bạn có thể yêu cầu lại tệp nhiều lần và nó sẽ luôn tham chiếu cùng một phiên bản. Nếu bạn muốn trở thành ưa thích, bạn có thể tạo ra mô-đun db của riêng bạn mà không một cái gì đó như thế này, để ngăn chặn đôi khách hàng tạo:

// db.js 
var db 
var redis = require('redis') 
exports.connect = function() { 
    if (!db) db = redis.createClient() 
    return db 
} 

exports.disconnect = function() { 
    redis.quit() 
    db = null 
} 


// index.js 
var dbHelper = require(.'/db') 
var db = dbHelper.connect() 

// whatever other file 
var dbHelper = require(.'/db') 
var db = dbHelper.connect() // won't connect twice 
+0

redis.quit() ngắt kết nối khách hàng https://github.com/mranney/node_redis#clientend :) – jbmusso

3

Bạn có thể tạo ra một ứng dụng toàn cầu và treo các vars bạn muốn chia sẻ ra đó hoặc bạn có thể sử dụng hàm khởi tạo trong tệp tuyến đường của mình

fe

// app.js 

var app = express.createServer() 
    , db = require('redis').createClient(); 

require('./routes').with(app, db); 

// routes.js 
module.exports.with = function(app, db) { 
    app.get('/',function(r,s) { s.end('Sweet');}); 
} 
Các vấn đề liên quan