2015-05-14 135 views
3

下面是Express.js的routing guide變形例:如何將參數傳遞給express.js路由器?

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

router.get('/', function(req, res) { 
    res.send('Birds home page'); 
}); 

router.get('/about', function(req, res) { 
    res.send('About birds'); 
}); 

... 
app.use('/birds', router); 
app.use('/fish', router); 

這版畫「關於鳥」當我訪問這兩個/birds/about/fish/about

如何向路由器傳遞參數或其他信息,所以在控制器功能中,它可以將這兩種不同的路線分開嗎?

例如,當訪問/birds/about時,我想看到「鳥可以飛」,當訪問/fish/about時,我會看到「魚可以遊」。

理想情況下,我希望能夠通過一些「配置對象」,所以小應用程序並不需要了解所有可能的途徑也可以安裝在(在僞代碼):

router.get('/about', function(req, res) { 
     res.send(magic_configuration.about_text); 
    }); 
    .... 
    magically_set_config(router, {about_text: "Bears eat fish"}) 
    app.use('/bears', router); 
+0

router.ge('/ birds/about',...)例如? –

+0

@DavidHaim:我有一組相關的路線(一個「迷你應用程序」)。我希望能夠重複使用它們而不重複,否則,如果我添加另一條路線,我將不得不復制'/鳥'和'/ fish'的更改,這很容易出錯 – Sergey

回答

4

這是我想出來的:我通過「微型應用程序配置」由它分配給req:在我的路線

app.use('/birds', function (req, res, next) { 
    req.animal_config = { 
     name: 'Bird', 
     says: 'chirp' 
    }; 
    next(); 
}, animal_router); 

app.use('/cats', function (req, res, next) { 
    req.animal_config = { 
     name: 'Cat', 
     says: 'meow' 
    } 
    next();   
}, animal_router); 

,然後我可以訪問它們:

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

... 

router.get('/about', function(req, res) { 
    var animal = req.animal_config; 
    res.send(animal.name + ' says ' + animal.says); 
}); 

此方法允許輕鬆地將「迷你應用程序」安裝在提供不同配置的其他位置,而無需修改應用程序代碼:

app.use('/bears', function (req, res, next) { 
    req.animal_config = { 
     name: 'Bear', 
     says: 'rawr' 
    }; 
    next(); 
}, animal_router); 
2

所以,如果你想爲通過URL的變化,那麼你可以注入PARAMS這樣的:

router.get('/:animal/about', function(req, res) { 
    // here we have bird or fish in req.params.animal 
    if(req.params.animal == 'bird') { 
     res.send('Birds can fly'); 
    } else if(req.params.animal == 'fish') { 
     res.send('Fish can swim'); 
    } else { 
     res.send('Unknown animal'); 
    } 
}); 
app.use('/', router); 
+0

是的,我已經想到了,但它也會匹配'/恐龍/約'。我想避免這種情況。 – Sergey

+0

你可以簡單地在未知的動物情況下調用next()。這樣任何其他匹配路線都將有機會被調用。 –

0

您可以添加路線PARAMS像這樣:

router.get('/about/:param1/:param2', function(req, res) { 
//then you can call this handler through /about/1/sometext get these params from request object: 
    console.log(req.params.param1, req.params.param2); // 1, 'sometext' 
    res.send('About birds'); 
}); 

或者,您可以通過查詢參數發送參數:

router.get('/about', function(req, res) { 
//then you can call this handler through /about?param1=1&param2=sometext get these params from request object as well: 
    console.log(req.query.param1, req.query.param2); // 1, 'sometext' 
    res.send('About birds'); 
});