2013-06-23 24 views
5

Sto cercando di imparare NodeJS ed Express. Im usando il pacchetto node-localstorage per accedere a localstorage. Questo funziona quando si utilizza il codice direttamente nella funzione come questaRegistrazione Funzioni di supporto Node.JS + Express

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

Ma io non voglio scrivere questo codice più e più volte in tutta la mia altra funzioni quando si accede a thestorage. Voglio essere in grado di registrare una funzione di supporto a cui posso accedere come

var localStorage = helpers.getLocalStorage 

o qualcosa del genere.

Come posso farlo in NodeJS? Ho visto qualcosa su app.locals? Ma come posso accedere all'oggetto app nei miei percorsi?

risposta

13

Ci sono molti modi per farlo, a seconda di come/dove si prevede di utilizzare i metodi di supporto. Personalmente preferisco impostare la mia cartella node_modules, chiamata utils, con tutti gli helper e i metodi di utilità di cui ho bisogno.

Per esempio, supponendo che la seguente struttura del progetto:

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

Basta aggiungere una cartella utils, sotto node_modules, con un file index.js contenente:

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; 

Poi, ogni volta che hanno bisogno di questa funzione, semplicemente require il modulo utils:

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

EDIT Come notato da Sean nei commenti, questo approccio funziona finché è il nome della cartella node_modules con un nome diverso da Node's core modules. Questo perché:

I moduli principali vengono sempre caricati preferenzialmente se il loro identificativo è passato a require(). Ad esempio, richiedere ('http') restituirà sempre il modulo integrato HTTP , anche se esiste un file con quel nome.

+0

Sì. Ho fatto qualcosa simillar: 'exports.getLocalStorage = function() { if (typeof localStorage === "indefinito" || localStorage === null) { \t var LocalStorage = require ('nodo-localStorage') .Memoria locale; localStorage = new LocalStorage ('./ scratch'); } return localStorage; }; Considereresti la tua strada come una "migliore pratica"? Sto cercando di imparare Node/express e voglio farlo "nel modo giusto" se sai cosa intendo. – JOSEFtw

+1

Beh, dipende davvero da cosa stai provando a fare. So che la "saggezza comune" è usare una cartella/lib per funzionalità comuni quando si hanno più app (come consigliato da TJ Holowaychuk stesso [qui] (http://vimeo.com/56166857)), ma altri preferiscono avere [helper localizzati] (https: // github.com/madhums/nodejs-express-mangusta-demo/albero/master/test). Preferisco questo metodo perché non devo preoccuparmi del percorso di 'utils' in' require ('utils') '(Tutti gli altri metodi useranno percorsi relativi). – verybadalloc

+0

@varybadalloc: Mi è stato concesso l'accesso a un progetto Node (il nodo è nuovo per me) e noto che ha già: require ('util') - sembra un pacchetto Node esistente. Non c'è connessione giusta? Se è così, chiamerò il mio modulo helper in modo diverso per chiarezza. – Sean