2013-06-23 33 views
5

Tôi đang cố gắng học NodeJS và Express. Im sử dụng gói node-localstorage để truy cập localstorage. Này hoạt động khi sử dụng mã trực tiếp trong hàm như thế nàyĐăng ký chức năng Trợ giúp Node.JS + Express

tuyến/social.js

exports.index = function(req, res) 
{ 
    if (typeof localStorage === "undefined" || localStorage === null) 
    { 
     var LocalStorage = require('node-localstorage').LocalStorage; 
     localStorage = new LocalStorage('./scratch'); 
    } 

localStorage.setItem('myFirstKey', 'myFirstValue'); 
console.log(localStorage.getItem('myFirstKey')); 
res.render('social/index', {title: "Start"}); 
} 

Nhưng tôi không muốn viết mã này hơn và hơn nữa trong khác tất cả của tôi khi truy cập localstorage. Tôi muốn có thể đăng ký chức năng trợ giúp mà tôi có thể truy cập như

var localStorage = helpers.getLocalStorage 

hoặc tương tự như vậy.

Tôi làm cách nào để thực hiện điều này trong NodeJS? Tôi đã nhìn thấy một cái gì đó về app.locals? Nhưng làm cách nào tôi có thể truy cập đối tượng ứng dụng trong các tuyến đường của mình?

Trả lời

13

Có nhiều cách để thực hiện việc này, tùy thuộc vào cách thức/nơi bạn dự định sử dụng các phương pháp trợ giúp của bạn. Cá nhân tôi thích đặt thư mục node_modules của riêng tôi, được gọi là utils, với tất cả những người trợ giúp và các phương thức tiện ích tôi cần.

Ví dụ, giả sử cấu trúc dự án sau:

 
app.js 
db.js 
package.json 
views/ 
    index.ejs 
    ... 
routes/ 
    index.js 
    ... 
node_modules/ 
    express/ 
    ... 

Chỉ cần thêm một thư mục utils, dưới node_modules, với một tập tin index.js chứa:

function getLocalStorage(firstValue){ 
    if (typeof localStorage === "undefined" || localStorage === null) 
    { 
     var LocalStorage = require('node-localstorage').LocalStorage; 
     localStorage = new LocalStorage('./scratch'); 
    } 
    localStorage.setItem('myFirstKey', 'myFirstValue'); 
    return localStorage; 
} 
exports.getLocalStorage = getLocalStorage; 

Sau đó, bất cứ lúc nào bạn cần chức năng này, chỉ cần require mô-đun utils:

var helpers = require('utils'); 
exports.index = function(req, res){ 
    localStorage = helpers.getLocalStorage('firstValue'); 
    res.render('social/index', {title: "Start"}); 
} 

EDIT Theo ghi nhận của Sean trong các ý kiến, phương pháp này làm việc như miễn là bạn đặt tên cho thư mục node_modules của bạn với một tên khác nhau từ Node's core modules. Điều này là do:

Mô-đun chính luôn được ưu tiên tải nếu số nhận dạng của chúng là được chuyển đến yêu cầu(). Ví dụ: yêu cầu ('http') sẽ luôn trả lại mô-đun HTTP tích hợp, ngay cả khi có tệp theo tên đó.

+0

Có. Tôi đã làm một cái gì đó simillar: 'exports.getLocalStorage = function() { if (typeof localStorage === "không xác định" || localStorage === null) \t {var LocalStorage = require ('nút-localStorage') .Lưu trữ cục bộ; localStorage = new LocalStorage ('./ scratch'); } trả về localStorage; }; ' Bạn có cân nhắc theo cách của mình là" Phương pháp hay nhất "không? Tôi đang cố gắng học Node/express và tôi muốn làm điều đó "đúng cách" nếu bạn biết ý tôi là gì. – JOSEFtw

+1

Vâng, nó thực sự phụ thuộc vào những gì bạn đang cố gắng làm. Tôi biết rằng "sự khôn ngoan thông thường" là sử dụng một thư mục lib/cho chức năng phổ biến khi bạn có nhiều ứng dụng (theo lời khuyên của TJ Holowaychuk mình [ở đây] (http://vimeo.com/56166857)), nhưng, những người khác thích có [người trợ giúp được bản địa hóa] (https: // github.com/madhums/nodejs-express-mongoose-demo/cây/chủ/thử nghiệm). Tôi thích phương pháp này bởi vì tôi không phải lo lắng về đường dẫn đến 'utils' trong' require ('utils') '(Tất cả các phương thức khác sẽ sử dụng các đường dẫn tương đối). – verybadalloc

+0

@varybadalloc: Tôi đã được cấp quyền truy cập vào một dự án Node (Node là mới đối với tôi) và nhận thấy rằng nó đã có: require ('util') - đó dường như là một gói Node hiện có. Không có kết nối phải không? Nếu vậy, tôi sẽ chỉ đặt tên mô-đun trợ giúp của tôi khác nhau để rõ ràng. – Sean

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