2012-01-06 27 views
5

Hiện nay tôi đang thiết lập kết nối khách hàng của tôi cho node-mysql bằng cách làm như sau trong tôi app.js và đặc biệt config/environment.js:Tôi nên xác định ứng dụng khách MySQL của mình ở đâu trong ứng dụng Node.js (Express)?

var client = mysql.createClient({ 
    user:  'USER', 
    database: 'DATABASE', 
    password: 'PASSWORD', 
    host:  'HOST' 
}); 

app.configure(function(){ 
    ... 
    app.set('client', client); 
    ... 
}); 

Sau đó, trong mã khách hàng của tôi, tôi chỉ cần gọi app.settings.client sử dụng MySQL client.

Tôi không chắc đây có phải là phương pháp phù hợp hay không và chắc chắn không hoạt động khi tôi đang thử nghiệm vì tôi cần một phiên bản đang chạy của ứng dụng.

Mọi đề xuất?

+1

Sử dụng 'app.set ('client')' thay vì 'app.settings.client'. Và nó sẽ làm việc với thử nghiệm, bạn chỉ cần tiêm một 'app' trống vào thử nghiệm đơn vị của bạn như là một phần của chế nhạo – Raynos

+0

@Raynos Làm thế nào để bạn tiêm một' ứng dụng 'trống rỗng? –

+0

tùy thuộc vào mã của bạn. [Tôi làm một cái gì đó như thế này] (https://github.com/Raynos/nCore-example/blob/master/test/routes-home.js) nhưng tôi cho rằng kiến ​​trúc của bạn hoàn toàn khác. – Raynos

Trả lời

2

Có 3 giải pháp cách tôi nhìn thấy nó:

a) Là @Raynos gợi ý trong các ý kiến, sử dụng app.set(key, value); để thiết lập một giá trị db và sau đó app.set (key) để có được giá trị đó.
b) Đưa tuyến đường của bạn vào một hàm chấp nhận cơ sở dữ liệu dưới dạng thông số. Ví dụ:

sample_route.js

module.exports = function (db) { 
    return function(req, res, next) { 
    // db is accessible here 
    } 
} 

app.js

var = sample_route = require('./sample_route')(db); 
app.get('/sample', sample_route); 


c) Thực hiện một biến toàn cầu sẽ có thể truy cập ở khắp mọi nơi (không được khuyến khích mặc dù): global.MY_DB = ...;

2

Tôi nghĩ rằng cách điển hình hơn để thực hiện việc này là xác định một phần mềm trung gian đơn giản để đặt máy khách mysql làm thuộc tính của yêu cầu. Ví dụ:

var client = mysql.createClient({ 
     user:  'USER', 
     database: 'DATABASE', 
     password: 'PASSWORD', 
     host:  'HOST' 
    }) 

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

Sau đó, trong trình xử lý tuyến đường, bạn có thể truy cập req.mysql. Trong các trường hợp thử nghiệm của bạn, bạn chỉ cần thiết lập req.mysql theo một cách nào đó, nó sẽ khá dễ dàng.

+3

Thật kinh khủng. Tạo một mysql objcet mới cho mỗi yêu cầu: ( – Raynos

+0

@Raynos Vâng, đó là lý do tại sao tôi sử dụng 'app.set()'. –

+1

Ok cũng tạo ra các khách hàng trên toàn cầu, nó vẫn thuận tiện để có req.mysql và dường như phù hợp với tốt với kiến ​​trúc Express truyền lại, hãy quay lại. – kgilpin

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