Node.js 多个快递对象
Node.js multiple express objects
我一直在尝试了解 Node.js 的 Expressjs 框架如何处理多个文件中的路由,但没有成功。我的主要 index.js 看起来类似于:
var express = require('express');
var app = express();
app.use('/route', require('./api/route'));
app.set('important_var', global_var);
在最后一行中,我为我的应用程序设置了一个全局变量,所有其他路由都需要它。
在第二个 JS 文件 './api/route.js' 中,我做了同样的事情:
var express = require('express');
var router = app.Router();
router.get('/path1', () => {...});
在第二个文件中,我需要一个 important_var,它是在 index.js 中的应用程序级别设置的。我怎样才能访问它?我可以使用 express() 创建新的(如果它被认为是新的)对象吗?来自 index.js 的变量 app 是否被视为单例并且不会被重新创建?我该如何处理这些情况?
要访问使用 app.set()
设置的值,您需要能够调用 app.get()
并且它需要与调用 [=13] 时使用的对象相同 app
=].每个 app
都是一个 Express 对象,它保持自己的状态。
使用路由器创建路由处理程序时,您可以通过 req.app
访问给定路由关联的 app
对象。因此,如果您在路由器中有代码,您可以像这样访问 app
对象上的内容:
router.get('/path1', () => {
let data = req.app.get('important_var');
// rest of route handler here
});
使用中间件并在 req
对象上设置您自己的 属性 可能更常见,所有路由处理程序随后都可以访问该对象:
const express = require('express');
const app = express();
// custom middleware
app.use(function(req, res, next) {
req.myImportantVar = someCalculation(important_var);
next();
});
app.use('/route', require('./api/route'));
然后,在路由器中,您可以这样做:
const router = require('express').Router();
router.get('/path1', () => {
console.log(req.myImportantVar);
// rest of route handler here
});
如果我正确理解你的问题,那么这些是你试图满足的要求:
- 配置服务器的主文件。
- 主文件设置了 "global" 可以通过应用程序内的各种路由访问的值。
- 一个可以访问全局值的子路由器文件。
如果这些要求是正确的,那么以下是满足它们的快速方式。
使用专门用于此用例的 app.set
for storing app globals can lead to issues since it is for assigning an app setting value. Instead, app globals can safely be stored to a app.locals
。
因此在您的主文件 (/index.js
) 中:
const express = require('express');
const app = express();
const subRouter = require('./api/route');
app.locals.important_var = 'My App Global';
app.use('/route', subRouter);
然后要在您的子路由器文件 (/api/route.js
) 中访问全局应用程序,您将使用 req.app.locals
对象,它是对 app.locals
:
的引用
const express = require('express');
const router = express.Router();
module.exports = router;
router.get('/path1', (req, res) => {
console.log(req.app.locals.important_var);
// ...
});
我一直在尝试了解 Node.js 的 Expressjs 框架如何处理多个文件中的路由,但没有成功。我的主要 index.js 看起来类似于:
var express = require('express');
var app = express();
app.use('/route', require('./api/route'));
app.set('important_var', global_var);
在最后一行中,我为我的应用程序设置了一个全局变量,所有其他路由都需要它。
在第二个 JS 文件 './api/route.js' 中,我做了同样的事情:
var express = require('express');
var router = app.Router();
router.get('/path1', () => {...});
在第二个文件中,我需要一个 important_var,它是在 index.js 中的应用程序级别设置的。我怎样才能访问它?我可以使用 express() 创建新的(如果它被认为是新的)对象吗?来自 index.js 的变量 app 是否被视为单例并且不会被重新创建?我该如何处理这些情况?
要访问使用 app.set()
设置的值,您需要能够调用 app.get()
并且它需要与调用 [=13] 时使用的对象相同 app
=].每个 app
都是一个 Express 对象,它保持自己的状态。
使用路由器创建路由处理程序时,您可以通过 req.app
访问给定路由关联的 app
对象。因此,如果您在路由器中有代码,您可以像这样访问 app
对象上的内容:
router.get('/path1', () => {
let data = req.app.get('important_var');
// rest of route handler here
});
使用中间件并在 req
对象上设置您自己的 属性 可能更常见,所有路由处理程序随后都可以访问该对象:
const express = require('express');
const app = express();
// custom middleware
app.use(function(req, res, next) {
req.myImportantVar = someCalculation(important_var);
next();
});
app.use('/route', require('./api/route'));
然后,在路由器中,您可以这样做:
const router = require('express').Router();
router.get('/path1', () => {
console.log(req.myImportantVar);
// rest of route handler here
});
如果我正确理解你的问题,那么这些是你试图满足的要求:
- 配置服务器的主文件。
- 主文件设置了 "global" 可以通过应用程序内的各种路由访问的值。
- 一个可以访问全局值的子路由器文件。
如果这些要求是正确的,那么以下是满足它们的快速方式。
使用专门用于此用例的 app.set
for storing app globals can lead to issues since it is for assigning an app setting value. Instead, app globals can safely be stored to a app.locals
。
因此在您的主文件 (/index.js
) 中:
const express = require('express');
const app = express();
const subRouter = require('./api/route');
app.locals.important_var = 'My App Global';
app.use('/route', subRouter);
然后要在您的子路由器文件 (/api/route.js
) 中访问全局应用程序,您将使用 req.app.locals
对象,它是对 app.locals
:
const express = require('express');
const router = express.Router();
module.exports = router;
router.get('/path1', (req, res) => {
console.log(req.app.locals.important_var);
// ...
});