2012-03-28 12 views
5

私はこのトピックによるNode.jsのConnectおよびエクスプレスutilsの

の世界に新たなんだ:What is Node.js' Connect, Express and “middleware”?
私は、ConnectExpress

の一部であった私は、コードに少し掘っていることを学びました

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

、より良い:

と私は2つの非常に興味深いのファイルを見つけました

これらの2つのファイルは便利な機能が満載で、正しく呼び出す方法が不思議でした。

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

しかし、私はそれは少し不器用な発見し、どのような私の他のファイルについて:

は限り、./myProject/app.jsで、それは私が何ですか?

例えば、ここに私のルートの1つである:

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は同じファイルにありますか?

私はこれがhugly?:

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

または、(さえapp.js用)よりエレガントな解決策がありますか?それらを使用するために私のmyresources.jsの開始時に呼び出す配置する必要がありますか

ありがとうございました!

答えて

2

だけよりエレガントな方法は、(急行があなたのルート「node_modules」フォルダ内にあると想定される):

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

ノードのインストールはWindows上で、ノードバージョン0.8.2


と追加情報のビット:

あなたは、パスのどこにいるか知っている必要はありませんし、相対パスを使用するように強制すること(./または../)、これは上行うことができます。この方法任意のファイルネスティングレベル。

Iルート「node_modules」フォルダ内のすべての私のカスタムモジュールは、(私は私のフォルダ「custom_modules」という名前)とネストの任意のレベルで、このようにそれらを呼び出す置く:ちょうど、二回全体のフレームワークをインストールし

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

このテクニックは将来的なものであるとは期待できません。 'express @ 4.0.0'は内部的にどのように機能するのかを完全に変えるかもしれないし、あなたが知っているすべてが' connect'を落とす可能性があります。また、プロジェクトの依存関係に 'connect'(' express'で使われているのと同じバージョン)をインクルードすると、この手法はうまくいきません。 –

+0

@ GauthamBadhrinathan私はすぐに接続することを予期していません:)しかし、接続は簡単にファイルの場所やその中にあるものを変更することができます - IMHOははるかに大きな危険です。 このテクニックは、プロジェクトの依存関係に接続を含める場合でも機能しますが、パスはまだ表現するように指定されているため、node.jsが最初に表示されます。 node.jsのドキュメント(ファイルモジュール)セクション: *先頭に '/'または 'が付いていません。/ 'を指定すると、モジュールは「コアモジュール」かnode_modulesフォルダからロードされます* http://nodejs.org/api/all.html#all_file_modules – Leonidaz

+0

はい、それは 'express 'は「コアモジュール」か「node_modules」にあります。しかし、 'connect'がプロジェクトの依存関係として追加された場合、' express/node_modules'ディレクトリ内に 'connect' *というディレクトリが見つかりません。 –

2

connectに直接アクセスしたい場合は、expressとともに、connectをプロジェクトの依存関係としてインストールすることをお勧めします。次に、あなたはvar utils = require('connect').utilsです。私が思いついた

+0

'require'を短くしていくつかのユーティリティ関数にアクセスするともっとエレガントに見えません... –

+2

大規模プロジェクトをビルドすると、モジュール間で多くの重複があることがわかります。例えば、私はいくつかの 'mkdirp'、' async'、 'eco'などを持っています。それは大きな問題ではありません。 –

+0

[DRY](http://ja.wikipedia.org/wiki/Don't_repeat_yourself)の「デザインパターン」を尊重することは、私にとって大変なことです。この時点で、私は自分自身のutilsモジュールで必要な機能をコピー/過去の方法よりも好む。しかし、あまり乾燥していてエレガントではありません... –

関連する問題