Express Router.use在中间件中

时间:2016-11-08 18:23:21

标签: node.js express

我是Express的新手。

我正在尝试根据DB中的值路由请求。为此,我正在调用服务功能。 路由工作成功但我丢失了请求对象。 我试图将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;
}

2 个答案:

答案 0 :(得分:1)

您正在丢失请求对象,因为您没有将其传递到任何地方。

我相信你的主要问题是你有三个路由处理程序在同一条路径/上注册。如果我没有弄错的话,他们将按顺序添加它们。但是,您的订单取决于您if来电的router.use()。所以这是不可预测的,并且可能无法按预期工作。 一旦注册,他们将保留在中间件堆栈,直到您重新启动应用程序。

我建议你重构一个地方的在线/离线逻辑,或者一次注册所有中间件,这样你知道它们被调用的顺序,并使用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。请注意…(req)

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

答案 1 :(得分: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();
    }