将对象传递给在 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,
};
当我的应用程序启动时,会创建一个对象,该对象在整个应用程序的多个文件中使用。在我的 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,
};