2012-03-28 20 views
5

Jestem nowy w świecie node.jsPodłącz i ekspresowe utils

Według tego tematu: What is Node.js' Connect, Express and “middleware”?
dowiedziałem się, że Connect był częścią Express

I wykopali trochę w kodzie, i znalazłem dwie bardzo interesujące pliki:

./myProject/node_modules/express/lib/utils.js 

lepszych:

./myProject/node_modules/express/node_modules/connect/lib/utils.js 

Te dwa pliki są pełne przydatnych funkcji i zastanawiałem się, jak prawidłowo je wywołać.

Jak dotąd, w ./myProject/app.js, że to, co robię:

var express = require('express') 
    , resource = require('express-resource') 
    , mongoose = require('mongoose') 
    , expresstUtils = 
     require('./node_modules/express/lib/utils.js'); 
    , connectUtils = 
     require('./node_modules/express/node_modules/connect/lib/utils.js'); 

Ale okazało się to trochę niezdarny, a co o moich innych plików?

przykład, oto jeden z moich trasach:

myResources = app.resource(
       'myresources', 
       require('./routes/myresources.js')); 

i tu jest treść myresources.js:

exports.index = function(req, res) 
{ 
    res.render('./myresources.jade', { title: 'My Resources' }); 
}; 

exports.show = function(req, res) 
{ 
    fonction resourceIsWellFormatted(param) 
    { 
    // Here is some code to determine whether the resource requested 
    // match with the required format or not 
    // return true if the format is ok 
    // return false if not 
    } 

    if (resourceIsWellFormatted(req.params['myresources'])) 
    { 
    // render the resource 
    } 
    else 
    { 
    res.send(400); // HEY! what about the nice Connect.badRequest in its utils.js? 
    } 
}; 

Jak widać w komentarzu po res.send(400), zadaję sobie pytanie, czy można użyć funkcji badRequest, która znajduje się w pliku utils.js modułu Connect.

Co z ładną funkcją md5 w tym samym pliku?

Czy muszę umieścić ten hugly zadzwonić na początku mojego myresources.js je ?:

var connectUtils = 
     require('../node_modules/express/node_modules/connect/lib/utils.js'); 

użyciu lub, tam jest bardziej eleganckie rozwiązanie (nawet dla app.js)?

Z góry dziękujemy za pomoc!

Odpowiedz

2

tylko bardziej elegancki sposób wymyśliłem jest (zakładając express jest wewnątrz swojej root "node_modules" Folder):

require("express/node_modules/connect/lib/utils"); 

węzeł instalacji w systemie Windows, wersja 0.8.2 węzeł


i trochę dodatkowych informacji:

ten sposób nie trzeba wiedzieć, gdzie jesteś w drodze i być zmuszony do korzystania ścieżki względnej (./ lub ../), można to zrobić na dowolny plik poziom zagnieżdżenia.

i umieścić wszystkie moje niestandardowe moduły wewnątrz folderu głównego „node_modules” (nazwałem mojego folderu „custom_modules”) i wywołać je w ten sposób na każdym poziomie zagnieżdżenia:

require("custom_modules/mymodule/something") 
+2

Nie można oczekiwać, że ta technika będzie odporna na przyszłość. 'express @ 4.0.0' może całkowicie zmienić to, jak funkcjonuje wewnętrznie i wszystko, co wiesz, może zrzucić' connect' (raczej nie, ale masz rację). I znowu, jeśli użyjesz 'connect' (tej samej wersji, która jest używana przez' express') w zależnościach twojego projektu, ta technika nie zadziała. –

+0

@GauthamBadhrinathan Nie przewiduję wyraźnego zrzucania połączenia w najbliższym czasie :) Jednak connect może łatwo zmienić lokalizację swoich plików lub to, co jest w nich - które IMHO jest o wiele większym niebezpieczeństwem. Ta technika powinna nadal działać, nawet jeśli włączysz połączenie w zależnościach projektu, ścieżka nadal wskazuje na wyrażenie, więc plik node.js przejdzie najpierw do wyrażenia. z sekcji dokumentacja node.js (moduły plików): * Bez wiodącego znaku "/" lub "./ 'aby wskazać plik, moduł jest albo "modułem rdzeniowym" lub jest ładowany z folderu node_modules. * http://nodejs.org/api/all.html#all_file_modules – Leonidaz

+0

Tak, przejdzie to do 'express 'który jest albo" modułem rdzenia "lub jest w" module węzła ". Ale jeśli 'connect' zostanie dodany jako zależność projektu, to nie znajdziesz katalogu' connect' * w * katalogu 'express/node_modules'. –

2

Jeśli chcesz uzyskać bezpośredni dostęp do connect, sugeruję instalację connect jako zależności od twojego projektu, wraz z express. Następnie możesz var utils = require('connect').utils.

+0

Instalowanie cały ram dwa razy, po prostu dostęp do niektórych funkcji narzędziowych o krótszym 'wymaganiu' nie wydaje się być bardziej elegancki ... –

+2

Po zbudowaniu dużego projektu okaże się, że wśród modułów jest wiele powielania. Np. Mam kilka 'mkdirp',' async', 'eco' itd. To nie jest wielka sprawa. –

+0

Szanować wzór [DRY] (http://en.wikipedia.org/wiki/Don't_repeat_yourself) "Wzór projektu" to dla mnie wielka sprawa. W tym momencie wolę kopiowanie/przeszłe juste funkcji potrzebuję w moim własnym module utils. Ale to nie jest bardzo suche, ani eleganckie ... –

Powiązane problemy