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);
  // ...
});