2016-11-08 41 views
1

我是Express的新手。在中間件中使用Express Router.use

我試圖根據數據庫中的值路由請求。爲此,我正在調用服務功能。 路由工作正常,但我失去了請求對象。 我試圖將req傳遞給服務,但它不起作用。

任何幫助顯示如何做到這一點很好。

這是我的代碼塊。

var companyService = require("services/companyService"); 
router.use('/', function (req, res, next) { 
companyService.isCompanyOnline(req.body.companyCode).then(function (company) { 
    if (company) { 
     router.use('/', require("api/controllers/online")); 
    } 
    else { 
     router.use('/', require("api/controllers/offline")); 
    } 
}); 
next(); 
}); 

module.exports = router; 

Services.companyService:

function isCompanyOnline(code) { 
var deferred = Q.defer(); 
companies.findOne({ companyCode: code }, function (err, company) { 
    if (err) deferred.reject(err.name + ': ' + err.message); 
    //if (err) throw err; 
    if (company) { 
     // return company online parameter 
     deferred.resolve(company.isOnline); 
    } else { 
     // company not found 
     deferred.resolve(); 
    } 
}); 
return deferred.promise; 
} 
+0

** **在哪裏你失去'req'對象?或者更好:你想在哪裏訪問'req'對象? – tmslnz

+0

@tmslnz在'api/controllers/online'或'api/controllers/online'路線中。 –

+0

那麼...遠去回覆 – tmslnz

回答

1

你失去的請求對象,因爲你沒有傳遞任何地方。

我相信你在這裏的主要問題是,你有三個路由處理程序註冊在相同的路徑/。如果我沒有弄錯,他們會按順序添加它們。但您的訂單取決於您撥打router.use()電話的if。所以它是不可預測的,並且可能不會像你期望的那樣工作。 註冊後,他們將停留在中間件堆棧中,直到您重新啓動應用程序。

我建議你重構有一個地方的在線/離線邏輯,或一次註冊所有的中間件,讓你知道在爲了他們被調用,並使用相應next()

在另一方面,如果你想一個參數傳遞給require d模塊,這樣做:

變化api/controllers/online的,另外,接受一個參數,並返回要傳遞的處理函數。

// your code in api/controllers/online and offline 

module.exports = function (req) { 
    // now you have req available in-scope here 
    function yourFunctionThatNeedsReq (req) { 
     // do stuff with req 
    } 
    return yourFunctionThatNeedsReq; 
}; 

然後像這樣更新您的require。請注意0​​。

router.use('/', require("api/controllers/online")(req)); 
+0

非常感謝它的工作:) –

+0

最後一點將無法正常工作。當聲明沒有請求時,你正在聲明這個函數。如果你只是這樣做:app.use('/',require('./ api/controllers/online'))你會得到你所描述的效果 – Paul

+0

@Paul不太確定你是否正確......'require(...) '返回一個「工廠」,'工廠(請求)'返回工廠傳入的請求對象的路由處理程序。 - 此外,它似乎已經爲OP工作。 – tmslnz

0

我的解決辦法:

首先,定義路線:

app.use('/api/online', require("api/controllers/online")); 
app.use('/api/offline', require("api/controllers/offline")); 

然後將URL中的路由器:

if (req.body.companyInfo.isOnline) { 
     req.url = '/online' + req.url + '/' + req.body.companyInfo.companyPath; 
     next(); 
    } 
    else { 
     req.url = '/offline' + req.url + '/' + req.body.companyInfo.companyPath; 
     next(); 
    } 
相關問題