2015-08-14 49 views
0

我正在使用node,express和jade製作項目。我想通過訪問內容:將別名查詢字符串表示爲參數

/Page/foo/bar 

/Page?Foo=foo&Bar=bar 

我想頂部是底部的別名。

這是解決我現在有:

server.js

// some stuff 
app.get('/Page/:Foo/:Bar',function(req,res){ 
    res.render('Page.jade', {Foo: req.params.Foo, Bar: req.params.Bar}); 
}); 
app.get('/Page',function(req,res){ 
    res.render('Page.jade', {Foo: req.query.Foo, Bar: req.query.Bar}); 
}); 
// more stuff 

Page.jade

doctype html 
html 
    head 
     script var foo = "!{Foo}"; bar = "!{Bar}"; 
     script(src="/Page.js") 
// stuff 

Page.js

// stuff with foo and bar, such as: 
console.log(foo); 
console.log(bar); 

事情我不我不喜歡這個解決方案它迫使我用明文處理參數和查詢(這幾乎是重複的代碼,但是不夠接近以減少它),將它傳遞給jade,jade將它存儲在一個變量中,唯一的目的是具有鏈接JavaScript文件使用這些變量。

通常只使用查詢字符串我只需要在Page.js中觸摸它。有沒有一種方法可以設置express來有效地將第一個URL解釋爲查詢字符串,就像第二個URL一樣,所以玉文件不必觸摸變量?

回答

0
  • 選項1:如果你只是想減少代碼冗餘,也許你可以保存你的控制器中外部文件,所以你最終的東西是這樣的:

    controllers/fooBarController.js

    exports.fooBarQueryOrParams = function(req, res) { 
        res.render('Page.jade', { 
         Foo: req.params.Foo || req.query.Foo, 
         Bar: req.params.Bar || req.query.Bar 
        }); 
    } 
    

    如果undefined無效四個您,您也可以添加一個默認值與另一個||運算符。

    server.js

    var fooBarController = require('controllers/fooBarController'); 
    
    app.get('/Page/:Foo/:Bar', fooBarController.fooBarQueryOrParams); 
    app.get('/Page',    fooBarController.fooBarQueryOrParams); 
    
  • 選項2:同樣的事情,但使用res.locals,所以現在沒有必要對任何對象傳遞給Page.js所有的意見會看到res.locals性質,僅僅通過它名稱,在這種情況下爲FooBar(不是res.locals.Foores.locals.Bar)。

    controllers/fooBarController.js

    exports.fooBarQueryOrParams = function(req, res) { 
        res.locals.Foo = req.params.Foo || req.query.Foo; 
        res.locals.Bar = req.params.Bar || req.query.Bar; 
        res.render('Page.jade'); 
    } 
    

    server.js

    var fooBarController = require('controllers/fooBarController'); 
    
    app.get('/Page/:Foo/:Bar', fooBarController.fooBarQueryOrParams); 
    app.get('/Page',    fooBarController.fooBarQueryOrParams); 
    
  • 方案3:始終暴露的一切思想res.locals

    controllers/fooBarController.js

    exports.fooBarQueryOrParams = function(req, res) { 
        res.render('Page.jade'); 
    } 
    

    server.js

    var fooBarController = require('controllers/fooBarController'); 
    
    app.use(function(req, res, next) { 
        for (var key in req.params) res.locals[key] = req.params[key]; 
        for (var key in req.query) res.locals[key] = req.query[key]; 
        next(); 
    }); 
    
    app.get('/Page/:Foo/:Bar', fooBarController.fooBarQueryOrParams); 
    app.get('/Page',    fooBarController.fooBarQueryOrParams); 
    

我會去的第一選擇,因爲我想你並不需要在所有的意見使用FooBar,所以沒有點使用res.locals把他們暴露給你所有的觀點,而不僅僅是那些真正需要他們的人。

0

你可以只設置對象屬性自己,並繼續到下一個路線等

app.use('/Page/:Foo/:Bar',function(req, res, next){ 

    for (var key in req.params) { 
     req.query[key] = req.params[key]; 
    } 

    next(); 

}); 
+0

這隻能讓明確看到查詢值,而不是Page.js文件,除非我失去了一些東西。 – DeadEli