2013-12-20 14 views
7

我使用shrinkroute https://npmjs.org/package/shrinkroute在nodejs中創建鏈接。我得到錯誤500 ReferenceError:收縮未定義如何將變量從app.js傳遞給routes/index.js?

如何將shrinkroute傳遞到routes/index.js?有沒有更好的方式通過傳遞查詢字符串參數來創建網址?

//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.appres.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'的一個(輕微)缺點是它暴露給模板。 – robertklep

0

你應該導入它。添加下面一行到你的代碼的最開始

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

謝謝你的建議,但它沒有幫助。 index.js沒有看到收縮變量 –

1

兩個簡單的方法來實現你想要的:

1.從您的路由中訪問您的shrinkroute實例

那樣簡單。 Shrinkroute安裝完成後不需要其他任何東西。

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.使用中間件

如果你不想用Shrinkroute非URL建築方法動心,你可以使用中間件,這將提供給你一些助手在您的路線,在你的模板中(通過本地人):

// 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

對於'使用中間件',我應該更好地閱讀文檔:) – robertklep

+0

shrinkroute中間件不起作用。我得到: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

var my_var = 'your variable'; 
 

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

,同時在route.js

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

我希望這會對我有用,但至今沒有運氣。你能否詳細說明這個答案,重點是我想如何通過變量?範圍問題?這應該工作的情況?或者也許不會工作?謝謝。 –