2013-04-14 6 views
12

私は非常に単純なnode.js noob質問を持っています。どのようにエクスポートされたルート関数に変数を渡すのですか?Node.jsは経路指定変数を渡します

ルート

exports.gettop = function(n, req, res) { 
    console.log(n); 
    res.send(200); 
}; 

Serverファイル

app.get('/api/v1/top100', routes.gettop(100)); 

エラーファイル:に.get()コールバック関数が必要ですが、あなたたとえば、[オブジェクト未定義]

答えて

25

を持って、あなたが作成したいがあなたの値をnに近づける新しい機能です。あなたのケースでは、gettopを実行して戻り値を渡してあなたのルートとして表現します。つまり、gettopはルートハンドラを返す必要があります。 loganfsmythさんに代わるものとして

exports.gettop = function(n){ 
    return function(req, res) { 
     console.log(n); 
     res.send(200); 
    }; 
}; 
7

ソリューション、あなたがそのままあなたのgettop機能を残して、部分関数作成することができます(非常に有効!):あなたがしているように、あなたのコードが見えたよう

app.get('/api/v1/top100', routes.gettop.bind(null, 100)); 
+0

使用し、あなたのルートからこの変数にアクセスするには!ありがとう! – Tobi

+0

奇妙なことに、このロジックは、バインドされた関数(routes.gettop)が '継承された'メソッド(つまり、独自のメソッドではなくオブジェクトのプロトタイプチェーンで定義されている)である場合には機能しません。ハンドラは実際に登録されていますが、呼び出されることはありません! – LexLythius

+0

@LexLythiusそれは決して奇妙に聞こえることはありません。私はそれが私の例では 'null'ですが、バインドされたメソッドはおそらくインスタンス(' routes')でなければならない間違ったコンテキストで呼び出されると思います。 – robertklep

13

をエクスプレスアプリのローカルを使用して結果のローカルを表現することで、変数をルートに渡すことができます。他の答えは作業の解決策を提案していますが、私はこれらの変数を設定するためにエクスプレスメカニズムを使用することはあまり目立たないと思います。

応答ローカル(See Express API reference)では、まずミドルウェアまたはルートのどこかに変数を設定する必要があります。私は幅の広い、より良いアプローチがあるあなたは、これらの設定アプリケーションを作りたいあなたは場合res.locals.variablename

exports.gettop = function(req, res) { 
    console.log(res.locals.top); 
    res.send(200); 
}; 

を経由してこのプロパティにアクセスすることができ、あなたのルートでミドルウェアアプローチ、その後

app.use(function(req,res, next) { 
    res.locals.top = 200; 
    next(); 
}); 

を紹介しますアプリの地元の変数を設定するには、アプリの地元の人々(See Express API reference

を使用するために、あなたは

app.locals.top = 100; 
0を使用することができます

はこれが私に頭痛と多くの時間を保存し

exports.gettop = function(req, res){ 
    console.log(req.app.locals.top); 
    res.send(200); 
}; 
+1

その場合、app.set(...)と '[req。] app.get(...)'を好むでしょう。これは副作用がないからです(ローカルにテンプレートが渡されるので)。 – robertklep

+0

私はミドルウェア関数の中で 'next()'を呼び出して、ページがハングしないようにしなければなりませんでした。 –

+0

@AmirEldorありがとう!問題を修正しました – saintedlama

関連する問題