2014-02-28 56 views
0

我有以下的功能,目的將是清潔獲得參數的寧靜API:快遞req.query成爲空

var clean_query = function(){ 
    return function(req, res, next){ 
     console.log(req.query) 
     // Do stuff 
     next(); 
    } 
} 

什麼是真正奇怪的是,當我嘗試這個功能,這裏是我在控制檯中看到:

✔ Express server listening on port 3000 in development mode 
✔ MongoDB connection done. 
✔ Server launched 

{ param1: 'toto', param2: 'titi' } 

/Users/... console.log(req.query) 
         ^
TypeError: Cannot read property 'query' of null 

的錯誤信息是很清楚的:它告訴我REQ爲null ....但是,如果你檢查控制檯輸出,你可以看到的console.log(req.query)被outputing內容到控制檯,所以它在現實中不是空的。

你知道什麼是我的錯誤嗎?

編輯:我的路線處理:

app.get(uri, clean_query(), get_list_func(schema)); 

編輯2:我的中間件:

app.use(express.logger('dev')); 
app.use(express.methodOverride()); 
app.use(express.bodyParser()); 
app.use(express.urlencoded()); 
app.use(express.json()); 
app.use(expressValidator()); 
app.use(express.cookieParser('secret')); 
app.use(express.session({ 
    store : MongoStore({ db : 'dbtest' }), 
    key : 'sessionid', 
    cookie : { httpOnly : false }, 
    secret : 'secret' 
}, function() { 
    app.use(app.router); 
})); 
app.use(passport.initialize()); 
app.use(passport.session()); 

編輯3:奇怪的,如果我從功能參數的下一次取出,有沒有更多的錯誤,但我可以不要使用那樣的功能,因爲我需要將它與其他控制器鏈接起來。

編輯4:哇,似乎這個函數被調用兩次....第一次它被稱爲req是好的,第二次它是空的。它必須與next()有關。

+0

可以顯示處理調用'clean_query'的路由的代碼嗎? –

+0

我用這個信息編輯我的答案。 –

+0

您是否使用任何其他自定義中間件? –

回答

-2

在定義要返回的函數的上下文中,沒有定義「req,res,next」。所以預計req將爲空。

您不需要返回clean_query中的函數。您可以將clean_query定義爲中間件函數,以解決該問題。

var clean_query = function(req, res, next){ 
    console.log(req.query) 
    // Do stuff 
    next(); 
} 
+0

你認爲這條線有什麼作用:'return function(req,res,next){' –

+0

該行返回中間件函數而不是定義因爲'clean_query'被用作中間件,所以爲什麼不把它定義爲建議的呢? 你可以使用'app.get(uri,clean_query,get_list_func(schema));'而不是調用函數獲取中間件 – harun

+0

您是否同意這與問題無關 –