2012-03-28 84 views
5

我在Node.js的連接和快速utils的

的世界新根據這一話題:What is Node.js' Connect, Express and 「middleware」?
我得知Connect是的Express

部分我在代碼中挖一點點,我發現了兩個很有意思的文件:

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

更好:

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

這兩個文件充滿了有用的功能,我想知道如何正確調用它們。

據,在./myProject/app.js,這就是我做的:

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'); 

但我發現它有點笨拙,那我的其他文件?

例如,這裏是我的路線之一:

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

這裏是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? 
    } 
}; 

正如你可以在res.send(400)後的評論看,我問自己,如果可以使用Connect模塊的utils.js文件中的badRequest函數。

那麼md5函數在同一個文件中呢?

我必須把這個在我的myresources.js開始hugly調用使用它們?:

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

,或者是有(即使是app.js)一個更優雅的解決方案嗎?

非常感謝您的幫助!

回答

2

只有更優雅的方式,我想出了是(假設表達的是你的根裏面的「node_modules」文件夾):

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

節點安裝在Windows上,節點版本0.8.2


和一些額外的信息:

這種方式,你不需要知道你在哪裏,在路徑和被迫使用相對路徑(./或../),這是可以做到上任何文件嵌套級別。

我把根「node_modules」文件夾內所有的自定義模塊(我叫我的文件夾「custom_modules」),並呼籲他們這樣在任何級別的嵌套:

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

你不能指望這種技術是未來的證明。 'express @ 4.0.0'可能會徹底改變它在內部的功能,並且你可能會放棄'connect'(不太可能,但你明白了)。再次,如果您要在項目的依賴項中包含'connect'(與'express'使用的版本相同),此技術將無法工作。 – 2012-08-29 10:29:23

+0

@GauthamBadhrinathan我不會預見快速下降連接很快:)然而,連接可以很容易地改變他們的文件或它們的位置 - 哪些恕我直言是一個更大的危險。 即使包含連接到項目的依賴關係中,該技術仍然可以工作,路徑仍然指向表達式,因此node.js將首先表達。 from node.js文檔(文件模塊)部分: *沒有前導'/'或'。/'來表示一個文件,該模塊可能是一個「核心模塊」,或者是從node_modules文件夾加載的。* http://nodejs.org/api/all.html#all_file_modules – Leonidaz 2012-09-09 17:46:52

+0

是的,它會去'express '這是一個「核心模塊」或者在「node_modules」中。但是,如果'connect'被添加爲項目依賴項,那麼在'express/node_modules'目錄內不會找到名爲'connect' *的目錄。 – 2012-09-14 13:32:21

2

如果您想直接訪問connect,我建議您安裝connect作爲項目的依賴項,以及express。那你可以var utils = require('connect').utils

+0

安裝的整體架構的兩倍,只是使用更短的'require'來訪問某些實用程序功能似乎不會更優雅... – 2012-03-28 11:24:53

+2

當您構建一個大型項目時,您會發現模塊之間有很多重複。例如,我有幾個'mkdirp','async','eco'等等。這沒什麼大不了的。 – 2012-03-28 11:28:17

+0

尊重[DRY](http://en.wikipedia.org/wiki/Don't_repeat_yourself)「設計模式」對我來說是一件大事。在這一點上,我更喜歡copy/past juste我需要在我自己的utils模塊中的功能。但它不是非常幹,也不優雅... – 2012-03-28 12:39:55