2013-06-23 3 views
5

Im пытается узнать NodeJS и Express. Я использую пакет node-localstorage для доступа к localstorage. Это работает при использовании коды непосредственно в функции, как этотРегистрация Вспомогательные функции Node.JS + Express

маршруты/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"}); 
} 

Но я не хочу писать этот код снова и снова во все моем друге функции при доступе к localstorage. Я хочу иметь возможность зарегистрировать вспомогательную функцию, к которой я могу получить доступ, например

var localStorage = helpers.getLocalStorage 

или что-то в этом роде.

Как это сделать в NodeJS? Я что-то видел в app.locals? Но как я могу получить доступ к объекту приложения на своих маршрутах?

ответ

13

Существует много способов сделать это, в зависимости от того, как/где вы планируете использовать свои вспомогательные методы. Я лично предпочитаю устанавливать свою собственную папку node_modules, называемую utils, со всеми помощниками и полезными методами, которые мне нужны.

Например, предположим следующую структуру проекта:

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

Просто добавьте папку utils под node_modules с index.js файл, содержащий:

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; 

Тогда, в любое время вам нужна эта функция, просто require модуль utils:

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

EDIT Как отметил Шон в комментариях, этот подход работает до тех пор, как вы называете папку node_modules с именем, отличным от Node's core modules. Это связано с тем, что:

Модули сердечника всегда предпочтительно загружаются, если их идентификатор передан require(). Например, require ('http') всегда возвращает встроенный модуль HTTP, даже если есть файл с этим именем.

+0

Да. Я сделал что-то: всего напоминает 'exports.getLocalStorage = функция() { если (TypeOf LocalStorage === "неопределенный" || LocalStorage === нуля) \t { вар LocalStorage = требуется ('узла-LocalStorage') .LocalStorage; localStorage = новый LocalStorage ('./ scratch'); } return localStorage; }; ' Вы считаете свой путь« Лучшей практикой »? Я пытаюсь узнать Node/express, и я хочу сделать это «правильно», если вы знаете, что я имею в виду. – JOSEFtw

+1

Ну, это действительно зависит от того, что вы пытаетесь сделать. Я знаю, что «общая мудрость» заключается в использовании библиотеки lib/для общей функциональности, когда у вас есть несколько приложений (как советовал сам TJ Holowaychuk [здесь] (http://vimeo.com/56166857)), но другие предпочитают с [локализованными помощниками] (https: // github.ком/madhums/nodejs-экспресс-мангуст-демонстрационный/дерево/ведущий/тест). Я предпочитаю этот метод, потому что мне не нужно беспокоиться о пути к 'utils' в' require ('utils') '(Все остальные методы будут использовать относительные пути). – verybadalloc

+0

@varybadalloc: Мне предоставлен доступ к проекту Node (узел для меня новичок) и обратите внимание, что он уже имеет: require ('util') - похоже, это уже существующий пакет Node. Нет никакой связи? Если это так, я просто буду называть мой вспомогательный модуль по-разному для ясности. – Sean

 Смежные вопросы

  • Нет связанных вопросов^_^