2012-10-26 31 views
6

Tôi đang tìm một số hướng ở đây từ một số lập trình viên node.js dày dạn kinh nghiệm. Vấn đề lớn nhất mà tôi đang gặp phải là chuyển các biến vào các mô-đun riêng biệt. Ví dụ trong server.js của tôi, tôi có như sau:Biến số lượt truy cập node.js

var db = mongoose.createConnection('localhost','test'); 

Bây giờ tôi không chạy tuyến đường của tôi bên trong của tập tin server.js chúng được tách ra thành các file riêng có. Vì vậy, cho một ví dụ blog của nó có thể là như thế này:

app.get('/blog/post/:id',function(req,res){ 
    //do something here 
} 

Bây giờ đây là nơi mà các vấn đề do thỏa thuận hợp Tôi không muốn phải thiết lập một kết nối cơ sở dữ liệu trong mỗi tuyến đường của tôi và chưa kể đến tôi sẽ suy nghĩ. rằng nó sẽ tạo ra một tấn kết nối. Làm thế nào để xử lý này, là có một mẫu "REAL WORLD" ứng dụng ra khỏi đó bởi vì tôi dường như không thể tìm thấy bất cứ điều gì về điều này và tôi biết mọi người đã có vấn đề này trước đây. Tôi biết rằng nút lưu trữ các mô-đun nhưng tôi không thể tưởng tượng rằng nó sẽ cache kết nối cho nó là trong mô-đun riêng của nó. Tôi tạo ra một mô-đun cấu hình mà chỉ giữ cấu hình trang web để yêu cầu này, nơi tôi cần nó không phải là một vấn đề. Tôi tưởng tượng có những thứ khác mà tôi sẽ muốn làm điều này với vì vậy nó sẽ là tốt nhất để tìm ra điều này ngay bây giờ.

Mọi trợ giúp đều được đánh giá cao.

Trả lời

3

Đây là những gì tôi làm trong ứng dụng thế giới thực của mình.

Tôi có mô-đun có tên redis (đó là cơ sở dữ liệu tôi đang sử dụng). Mã chứa mã sau:

var store; 

exports.store = store = redis.createClient(config.port, config.url); 

Vì vậy, tôi có thể trực tiếp truy cập ứng dụng, nếu cần. Tôi hầu như không bao giờ làm điều đó. Các mô-đun cùng chứa mã như thế này:

exports.getData = function(dataID, callback){ 

    var key = DATA_STORE_PREFIX; 

    try{ 
     store.hget(key, dataID, callback); 
    } catch(err){ 
     callback(err); 
    } 
} 

tôi sử dụng này bằng cách bao gồm các module redis trong một hoặc nhiều module tuyến đường và gọi nó như thế này:

var db = require('redis'); 

db.getData('someData', function(err, result){ 
    console.log(result); // real world code goes here! 
}); 

Hệ thống mô-đun nút sẽ chăm sóc của nghỉ ngơi.

+0

Vì vậy, câu hỏi duy nhất của tôi về việc này là không này tạo ra một kết nối mới mọi lúc? Tôi thực sự bắt đầu làm điều này nhưng tôi muốn chắc chắn nó không. – ngreenwood6

+0

Dường như sử dụng lại một kết nối hiện có, nếu có. Nếu kết nối tự động bị ngắt khi không được sử dụng thì kết nối sẽ kết nối lại. –

2

Một cách để làm điều đó là thêm kết nối làm thuộc tính của đối tượng sẽ có sẵn cho tất cả các mô-đun cần. Ví dụ trong ứng dụng nhanh của tôi, tôi có một cái gì đó như thế này trong chính tập tin ứng dụng của tôi:

require('./config/database')(app); 

và file config/database trông giống như:

var mongoose = require('mongoose'); 

module.exports = function(app) { 
    var database = app.get('env'); 
    var uri = database === 'production' ? 'something...' : 'localhost'; 
    return app.locals.db = mongoose.createConnection(uri, database); 
}; 

Bất kỳ module cần một kết nối db sau đó có thể truy cập app.locals.db đơn giản bằng cách xuất một hàm nhận app làm đối số (giống như ở trên). Tất nhiên bạn sẽ cần phải sửa đổi điều này một chút nếu bạn đang sử dụng một cái gì đó khác hơn là thể hiện, nhưng ý tưởng vẫn giữ nguyên.

+0

Giải pháp rất sáng tạo nhưng tôi nghĩ loại đám mây đó là người dân địa phương.Điều này chắc chắn là một cái gì đó hữu ích mặc dù để truyền dữ liệu cho người dân địa phương tự động – ngreenwood6

+0

Tôi nghĩ rằng đó là những gì 'app.locals' là có cho. Tôi đã thực hiện điều này đến mức cực đoan trong dự án hiện tại của mình bằng cách đệ quy tự động tải và gán tất cả các thành phần chính của ứng dụng cho các thuộc tính của 'app.locals' - ví dụ: tất cả các mô hình của tôi đều nằm trong 'app.locals.models'. Tôi thích mẫu này vì hai lý do: Thứ nhất, mô-đun của tôi hoạt động độc lập với cấu trúc tệp, tức là tôi không phải viết những thứ như 'require ('../../ models/user')' trên toàn bộ địa điểm. Thứ hai, thư viện được chia sẻ của tôi có sẵn cho các lượt xem - ví dụ: nếu tôi có 'app.locals.lib.urlFor', tôi có thể sử dụng nó trong dạng xem là' lib.urlFor'. –

+0

Cũng giống như tôi đã nói tôi nghĩ rằng nó có sử dụng của nó (đặc biệt là cho cấu hình hoặc tiện ích) nhưng db tôi thích có thể chỉ cần. Cảm ơn mặc dù cho u đầu vào thực hiện một điểm hợp lệ thực sự về yêu cầu – ngreenwood6

1

Bạn đang sử dụng Express, tôi hiểu. Chỉ cần làm:

app.set('db', mongoose.createConnection('localhost','test')) 

Sau đó, trong bất kỳ nhà xây dựng mô-đun, hãy chắc chắn để vượt qua biến app, và bạn có thể sử dụng để có được app.get('db')db để làm việc.

+0

Cảm ơn bạn đã trả lời nhưng tôi nghĩ rằng giải pháp khác phù hợp hơn nhiều. Sau đó, mô-đun của tôi có thể chung chung hơn và nó có vẻ sạch hơn. – ngreenwood6

Các vấn đề liên quan