2012-09-14 37 views
5

Tôi có một ứng dụng chạy trên Expressjs NodeJS 0.8.8 sử dụng MongoDB và Jade mẫu ngôn ngữ, và tôi muốn cho phép người dùng cấu hình nhiều tùy chọn trang web trình bày toàn chẳng hạn như tiêu đề trang, hình ảnh logo, vvLàm thế nào tôi có thể lưu trữ cấu hình trang web trong MongoDB cho một ứng dụng NodeJS Express?

Làm cách nào để lưu trữ các tùy chọn cấu hình này trong cơ sở dữ liệu mongoDB để tôi có thể đọc chúng khi khởi động ứng dụng, thao tác chúng trong khi ứng dụng đang chạy và hiển thị chúng trong các mẫu ngọc?

Đây là thiết lập ứng dụng nói chung tôi:

var app = module.exports = express(); 
global.app = app; 
var DB = require('./accessDB'); 
var conn = 'mongodb://localhost/dbname'; 
var db; 

// App Config 
app.configure(function(){ 
    ... 
}); 

db = new DB.startup(conn); 

//env specific config 
app.configure('development', function(){ 
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
}); // etc 

// use date manipulation tool moment 
app.locals.moment = moment; 

// Load the router 
require('./routes')(app); 

Cho đến nay tôi đã tạo ra một mô hình gọi là "Trang web" cho bộ sưu tập "siteConfig" và tôi có một chức năng gọi là getSiteConfig trong accessDB.js chạy Site.find() ... để truy xuất các trường trong một tài liệu trong bộ sưu tập.

Vì vậy, đây là mấu chốt của câu hỏi: làm thế nào tôi nên tiêm những lĩnh vực vào ứng dụng nhanh để họ có thể được sử dụng trong trang web? Tôi có nên làm theo cùng một mẫu mà tôi đã sử dụng với công cụ moment.js không? Như thế này:

db.getSiteConfig(function(err, siteConfig){ 
    if (err) {throw err;} 
    app.locals.siteConfig = siteConfig; 
}); 

Nếu không, cách chính xác để làm điều này là gì?

Cảm ơn!

+0

là cái gì đó bạn muốn để lưu trữ trong phiên giao dịch? – c0deNinja

+0

Không, tôi không tin như vậy. Tôi không muốn khách hàng có quyền truy cập vào nó. Tôi chỉ muốn ứng dụng express phía máy chủ (đặc biệt là Jade) có quyền truy cập vào nó. Tôi có nó làm việc lên đến mức một console.log. Tôi đoán tôi chỉ nên cố gắng thêm nó vào app.locals và xem những gì sẽ xảy ra, nhưng tôi không chắc chắn về những tác động bảo mật của việc sử dụng nó. (hoặc sự ổn định của nó) – tutley

Trả lời

16

Xem xét sử dụng middleware rõ ràng về việc tải trang web config.

app.configure(function() { 
    app.use(function(req, res, next) { 
    // feel free to use req to store any user-specific data 
    return db.getSiteConfig(req.user, function(err, siteConfig) { 
     if (err) return next(err); 
     res.local('siteConfig', siteConfig); 
     return next(); 
    }); 
    }); 
    ... 
}); 

Ném lỗi là một ý tưởng thực sự tồi vì nó sẽ làm hỏng ứng dụng của bạn. Thay vào đó, hãy sử dụng next(err);. Nó sẽ chuyển lỗi của bạn để thể hiện errorHandler.

Nếu bạn đã xác thực người dùng của mình (ví dụ phần mềm trung gian trước) và lưu dữ liệu của nó vào req.user, bạn có thể sử dụng nó để lấy cấu hình đúng từ db.

Nhưng hãy cẩn thận với việc sử dụng hàm getSiteConfig bên trong phần mềm trung gian nhanh vì nó sẽ tạm dừng chuyển tiếp từ việc xử lý tiếp theo yêu cầu cho đến khi nhận được dữ liệu.

Bạn sẽ xem xét bộ nhớ đệm siteConfig trong phiên nhanh để tăng tốc bạn ứng dụng. Lưu trữ dữ liệu phiên cụ thể trong phiên thể hiện là hoàn toàn an toàn vì không có cách nào để người dùng có quyền truy cập vào nó.

Ví dụ dưới đây ý tưởng của bộ nhớ đệm siteConfig trong sessionn nhanh:

app.configure(function() { 
    app.use(express.session({ 
    secret: "your sercret" 
    })); 
    app.use(/* Some middleware that handles authentication */); 
    app.use(function(req, res, next) { 
    if (req.session.siteConfig) { 
     res.local('siteConfig', req.session.siteConfig); 
     return next(); 
    } 
    return db.getSiteConfig(req.user, function(err, siteConfig) { 
     if (err) return next(err); 
     req.session.siteConfig = siteConfig; 
     res.local('siteConfig', siteConfig); 
     return next(); 
    }); 
    }); 
    ... 
}); 
+1

Đây là một câu trả lời tuyệt vời và tôi thực sự đánh giá cao nó. Thật không may, tôi không thể bỏ phiếu vì tôi không có đủ danh tiếng, nhưng nếu có ai đó xem, hãy bỏ phiếu này. Cảm ơn một lần nữa. – tutley

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