2016-11-08 81 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(); 
    } 
相关问题