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

RUE*_*INE 3 middleware node.js express

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

测试.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;
Run Code Online (Sandbox Code Playgroud)

应用程序.js

const assessmentRoutes = require('./routes/test');
app.use(assessmentRoutes);
Run Code Online (Sandbox Code Playgroud)

我试图让变量传入的一种方法是将 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"
    })    
});
}
Run Code Online (Sandbox Code Playgroud)

然后在 app.js 中 require 更改为:

const assessmentRoutes = require('./routes/assessments')(globalVariable);
Run Code Online (Sandbox Code Playgroud)

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

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

Dan*_*ger 6

使用全局对象

我不推荐的一种方法是使用global对象:

app.js

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

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

app.use(assessmentRoutes);
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

? 导出函数并传入选项

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

app.js

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

app.use(assessmentRoutes({ abc: ... }));
Run Code Online (Sandbox Code Playgroud)

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;
};
Run Code Online (Sandbox Code Playgroud)

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

一个类似的选择是导出router对象以及一个 setter 函数来初始化globalVariable内部test.js

app.js

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

initAssessmentRoutes({ abc: ... });

app.use(assessmentRoutes);
Run Code Online (Sandbox Code Playgroud)

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,
};
Run Code Online (Sandbox Code Playgroud)