2013-06-23 25 views
5

Ich versuche NodeJS und Express zu lernen. Ich verwende das node-localstorage-Paket, um auf den lokalen Speicher zuzugreifen. Dies funktioniert, wenn Sie den Code direkt in der Funktion ähnlicheRegister Hilfsfunktionen Node.JS + Express

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

Aber ich will diesen Code nicht immer und immer wieder in allen meinen anderen wieder schreiben Funktionen beim Zugriff auf den lokalen Speicher. Ich möchte in der Lage sein, eine Hilfsfunktion zu registrieren, auf die ich zugreifen kann, wie

var localStorage = helpers.getLocalStorage 

oder etwas ähnliches.

Wie kann ich dies in NodeJS tun? Ich habe etwas über app.locals gesehen? Aber wie kann ich auf meinen Routen auf das App-Objekt zugreifen?

Antwort

13

Es gibt viele Möglichkeiten, dies zu tun, je nachdem, wie/wo Sie Ihre Hilfsmethoden verwenden möchten. Ich persönlich bevorzuge es, meinen eigenen Ordner node_modules mit Namen utils mit allen Hilfsmitteln und Hilfsmethoden, die ich brauche, einzurichten.

Zum Beispiel der folgende Projektstruktur unter der Annahme:

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

Fügen Sie einfach einen utils Ordner unter node_modules mit einer index.js Datei enthält:

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; 

Dann, wann immer Sie diese Funktion benötigen, einfach require das Modul utils:

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

EDIT Wie von Sean in den Kommentaren, funktioniert dieser Ansatz so lange wie Sie mit einem anderen Namen als Node's core modules Ihren node_modules Ordnernamen. Dies liegt daran:

Kernmodule werden immer bevorzugt geladen, wenn ihre Kennung an require() übergeben wird. Zum Beispiel liefert require ('http') immer das eingebaute HTTP-Modul, auch wenn es eine Datei mit diesem Namen gibt.

+0

Ja. Ich habe etwas simillar: 'exports.getLocalStorage = function() { if (typeof local === "undefiniert" || local === null) \t { var = Localstorage erfordern ('node-local') .Lokaler Speicher; localStorage = neues LocalStorage ('./ scratch'); } Rückgabe localStorage; }; ' Würdest du deinen Weg als" Best Practice "betrachten? Ich versuche Node/Express zu lernen und ich möchte es "richtig machen", wenn Sie wissen, was ich meine. – JOSEFtw

+1

Nun, es hängt wirklich davon ab, was Sie versuchen zu tun. Ich weiß, dass die "allgemeine Weisheit" ist, einen lib/Ordner für allgemeine Funktionen zu verwenden, wenn Sie mehrere Apps haben (wie von TJ Holowaychuk selbst empfohlen [hier] (http://vimeo.com/56166857)), aber andere bevorzugen [lokalisierte Helfer] haben (https: // github.com/madhums/nodejs-express-mongoose-demo/baum/master/test). Ich bevorzuge diese Methode, weil ich mir keine Gedanken über den Pfad zu "utils" im 'require ('utils')' machen muss (Alle anderen Methoden verwenden relative Pfade). – verybadalloc

+0

@varybadalloc: Ich habe Zugang zu einem Node-Projekt bekommen (Node ist neu für mich) und bemerke, dass es bereits folgendes hat: require ('util') - das scheint ein existierendes Node-Paket zu sein. Es gibt keine Verbindung richtig? Wenn ja, werde ich mein Helper-Modul nur zur besseren Übersicht anders benennen. – Sean