2013-06-23 3 views
5

J'essaie d'apprendre NodeJS et Express. Im en utilisant le paquet node-localstorage pour accéder au localstorage. Cela fonctionne en utilisant le code directement dans la fonction comme ceFonctions d'enregistrement de registre Node.JS + Express

routes/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"}); 
} 

Mais je ne veux pas écrire ce code encore et encore dans tous mes autres fonctions lors de l'accès au localstorage. Je veux être en mesure d'enregistrer une fonction d'aide que je peux accéder comme

var localStorage = helpers.getLocalStorage 

ou quelque chose comme ça.

Comment puis-je faire cela dans NodeJS? J'ai vu quelque chose sur app.locals? Mais comment puis-je accéder à l'objet d'application dans mes itinéraires?

Répondre

13

Il existe plusieurs façons de le faire, selon comment/où vous prévoyez d'utiliser vos méthodes d'assistance. Personnellement, je préfère définir mon propre dossier node_modules, appelé utils, avec toutes les aides et les méthodes utilitaires dont j'ai besoin.

Par exemple, en supposant que la structure suivante du projet:

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

ajouter simplement un dossier utils, sous node_modules, avec un fichier index.js contenant:

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; 

Alors, quand vous avez besoin de cette fonction, simplement require le module :

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

EDIT Comme l'a noté Sean dans les commentaires, cette approche fonctionne aussi longtemps que vous nommez votre dossier node_modules avec un nom différent de Node's core modules. Cela est dû au fait que:

Les modules principaux sont toujours chargés de manière préférentielle si leur identificateur est passé à require(). Par exemple, require ('http') renverra toujours le module HTTP intégré, même s'il existe un fichier portant ce nom.

+0

Oui. Je l'ai fait quelque chose simillar: 'exports.getLocalStorage = function() { if (typeof localStorage === "non défini" || localStorage === null) { \t var LocalStorage = require ('nœud localStorage') .Stockage local; localStorage = new LocalStorage ('./ scratch'); } return localStorage; }; ' Considéreriez-vous votre chemin comme une« meilleure pratique »? Im essayant d'apprendre Node/express et je veux le faire "dans le bon sens" si vous savez ce que je veux dire. – JOSEFtw

+1

Eh bien, cela dépend vraiment de ce que vous essayez de faire. Je sais que la "sagesse commune" est d'utiliser un dossier lib/pour des fonctionnalités communes lorsque vous avez plusieurs applications (comme conseillé par TJ Holowaychuk lui-même [ici] (http://vimeo.com/56166857)), mais d'autres préfèrent avoir [helpers localisés] (https: // github.com/madhums/nodejs-ex-mongoose-demo/tree/master/test). Je préfère cette méthode car je n'ai pas à me soucier du chemin vers 'utils' dans' require ('utils') '(toutes les autres méthodes utiliseront des chemins relatifs). – verybadalloc

+0

@varybadalloc: J'ai eu accès à un projet Node (Node est nouveau pour moi) et remarque qu'il a déjà: require ('util') - cela semble être un paquet Node existant. Il n'y a pas de connexion, n'est-ce pas? Si c'est le cas, je vais simplement nommer mon module d'aide différemment pour plus de clarté. – Sean