将对象传递给在 nodejs 中用作中间件的路由文件

Pass object to routes file used as middleware in nodejs

当我的应用程序启动时,会创建一个对象,该对象在整个应用程序的多个文件中使用。在我的 app.js 文件中,我需要几个包含我的路线的文件。这些路由需要访问在 app.js 中创建的对象,所以我试图将它传递给这些文件中的每一个。下面是其中一个文件的示例。

test.js

const express = require('express');
const router = express.Router();

router.use('/api', router);

router.post('/testRoute', (req, res, next) => {
    if(globalVariable.abc) { //globalVariable is the variable created in app.js
        //do some logic
    }
    res.json({
        message: "Test Route Success"
    })    
});

module.exports = router;

app.js

const assessmentRoutes = require('./routes/test');
app.use(assessmentRoutes);

我尝试获取传入变量的一种方法是将 test.js 中的路由包装在一个函数中,该函数采用这样的变量。

module.exports = function(globalVariable) {
    router.post('/testRoute', (req, res, next) => {
    if(globalVariable.abc) { //globalVariable is the variable created in app.js
        //do some logic
    }
    res.json({
        message: "Test Route Success"
    })    
});
}

然后在 app.js 中,要求更改为:

const assessmentRoutes = require('./routes/assessments')(globalVariable);

当我这样做时,我在启动应用程序时遇到错误,例如 app.use() 需要一个中间件函数。

如何将对象传递到我的路线中?

APP.JS

 app.locals.globalVariable= {type:"Fiat", model:"500", color:"white"};

TEST.JS

if (req.app.locals.globalVariable.type =="Fiat" ) {
.....
}

在你的 test.js 中删除:

router.use('/api', router);

在您的 app.js 中更改此行:

app.use('/', assessmentRoutes);

这应该有效。

使用全局对象

一种方法,which I don't recommend, is using the global对象:

app.js

const assessmentRoutes = require('./routes/test');

global.globalVariable = { abc: ... };

app.use(assessmentRoutes);

test.js

const express = require('express');
const router = express.Router();

router.post('/testRoute', (req, res, next) => {

    if (globalVariable.abc) { ... }

    res.json({
        message: 'Test Route Success',
    });
});

module.exports = router;

✨ 导出函数并传入选项

另一种方法是导出一个函数,您可以在其中将其作为参数传递,就像您所做的那样。问题是您没有从该函数返回路由器,您稍后需要在 app.js:

中使用

app.js

const assessmentRoutes = require('./routes/test');

app.use(assessmentRoutes({ abc: ... }));

test.js

const express = require('express');
const router = express.Router();

module.exports = function(globalVariable) {

    router.post('/testRoute', (req, res, next) => {

        if (globalVariable.abc) { ... }

        res.json({
            message: 'Test Route Success',
        });
    });

    //  This is what you were missing in your code!
    return router;
};

✨ 导出路由器和一个setter函数

类似的选项是导出 router 对象以及 setter 函数以在 test.js:

中初始化 globalVariable

app.js

const { assessmentRoutes, initAssessmentRoutes } = require('./routes/test');

initAssessmentRoutes({ abc: ... });

app.use(assessmentRoutes);

test.js

const express = require('express');
const router = express.Router();

let globalVariable = { abc: null };

function initAssessmentRoutes(options) {
    globalVariable = options;
}

router.post('/testRoute', (req, res, next) => {

    if (globalVariable.abc) { ... }

    res.json({
        message: 'Test Route Success',
    });
});

module.exports = {
    assessmentRoutes: router,
    initAssessmentRoutes,
};