2013-12-20 11 views
7

私はノードルートのリンクを作るために縮み線https://npmjs.org/package/shrinkrouteを使用しています。エラー500が返されるReferenceError:shrinkrが定義されていないapp.jsからroutes/index.jsに変数を渡すにはどうすればよいですか?

経路/ index.jsに縮小ルートを渡すにはどうすればよいですか?クエリ文字列argsを渡してURLを作成するより良い方法はありますか?

//app.js 
var app = express(); 

var shrinkr = shrinkroute(app, { 
    "user": { 
     path: "/user/:id?", 
     get: routes.showOrListUsers 
    } 
}); 
//url method works in app.js  
var url = shrinkr.url("user", { id: 5, page:40, type:'a' }); 
console.log(url); 

app.use(shrinkr.middleware); 

//routes/index.js 
exports.showOrListUsers = function(req, res, next) {      
    console.log(req.params); 
    //shrinkr errors out in index.js          
    var url2 = shrinkr.url("users", {name: "foo"});      
    console.log(url2);                   
}  

答えて

14

一つの解決策は、app.setを使ってアプリのオブジェクトでshrinkrを保存するために、次のようになります。

// app.js 
... 
app.set('shrinkr', shrinkr); 
... 

routes/index.jsでは、あなたがreq.appまたはres.appを介してアクセスすることができますオブジェクト:

exports.showOrListUsers = function(req, res, next) { 
    var shrinkr = req.app.get('shrinkr'); 
    ... 
}; 
+0

['app.locals'](http://expressjs.com/api.html#app。)を使用するのはもっと慣れないでしょうか?地元の人々)は、アプリのローカル変数を設定するには? –

+1

@YanFotoええ、もう一つの選択肢です。 'app.locals'を使うことの1つの(わずかな)欠点は、テンプレートに公開されることです。 – robertklep

0

インポートする必要があります。あなたのコードの先頭に次の行を追加します

var shrinkroute = require('shrinkroute'); 
+0

ご協力いただきありがとうございます。 index.jsにshrinkr変数がありません –

1

あなたが望むものを達成するための2つの簡単な方法:

1.経路内から縮小ルートインスタンスにアクセスする

そのように単純です。 Shrinkrouteをセットアップした後は、他に何も必要ありません。あなたがShrinkrouteの非URLの建築方法で誘惑されたくない場合、あなたはあなたのルートにあるいくつかのヘルパーあなたに利用できるようになりますミドルウェアを使用することができますミドルウェア

を使用して

exports.showOrListUsers = function(req, res, next) { 
    var shrinkr = req.app.shrinkroute; 
    console.log("Route: " + req.route.name); // ta-da, made available by Shrinkroute 
    // do your URL buildings 
}; 

2とあなたのテンプレートで(地元の人を介して):

// app.js 
app.use(shrinkr.middleware); 

// routes/index.js 
exports.showOrListUsers = function(req, res, next) { 
    console.log("Route: " + req.route.name); // ta-da, made available by Shrinkroute 

    req.buildUrl("users", { name: "foo" }); 
    // or, if you want the full url with the scheme and host... 
    req.buildFullUrl("users", { name: "foo" }); 
}; 

おそらくテンプレートでも使いたいのですか?

// templates/index.jade 
a(href=url("users", { name: "foo" })) Foo profile 
a(href=fullUrl("users", { name: "foo" })) Foo profile 

この方法には、ルート内のルートセッターに直接アクセスできないという利点があります。


免責事項:私はShrinkrouteの著者です。

+1

+1「ミドルウェアを使用しています」、私はドキュメントをよく読んでいたはずです:) – robertklep

+0

シュルートミドルウェアは機能しません。私は取得します:TypeError:Object#にはメソッド 'buildUrl'がありません –

+0

@VladVinnikov [テストあり](https://github.com/gustavohenke/shrinkroute/blob/master/test/index.js#L279)から確実に機能する。問題をデバッグするための助けが必要な場合は、[バグを記入してください](https://github.com/gustavohenke/shrinkroute/issues/new)。 – gustavohenke

3
少し遅れて相手に

が、以下は同様に動作します。

app.js route.js

var my_var = 'your variable'; 
 

 
var route = require('./routes/index')(my_var); 
 
app.get('/', route);

とその間に

var express = require('express') 
 
, router = express.Router() 
 

 
// Router functions here, as normal; each of these 
 
// run only on requests to the server 
 

 
router.get('/', function (req, res, next) { 
 
    res.status(200).end('Howdy'); 
 
}); 
 

 

 
module.exports = function(my_var){ 
 

 
    // do as you wish 
 
    // this runs in background, not on each 
 
    // request 
 

 
    return router; 
 
}

+0

ありがとう!これは本当に私を助けました! – naveed

+0

これは私のためにはうまくいくと思っていましたが、これまでは運がありませんでした。あなたはこの答えを詳しく説明できますか?変数がどのように渡されるのか、私は考えていますか?スコープの問題?これがうまくいくべき状況?またはおそらく動作しませんか?ありがとう。 –

関連する問題