【问题标题】:How to access application-level middleware from router?如何从路由器访问应用级中间件?
【发布时间】:2019-10-30 17:40:33
【问题描述】:

我正在尝试从使用 express 应用程序生成器生成的项目中的路由器访问我的应用程序级中间件。

中间件用于使用从路由器接收到的用户 ID 查询数据库。

我觉得我错过了一些非常简单(或基本)的东西,但无法解决问题(这是我的第一个 Node.js 项目)。因此,除了最佳实践之外,我还在寻找一个简单的解决方案

我尝试过使用不同的应用方法,包括发布。

/app.js

var MyAppMidW = function (req, res, next) {
  res.send(queryDB(req));
  next()
}
app.use(MyAppMidW);

/routes/index.js

router.get("/dbquery", (req, res) => {
  if (req.header('auth-header')) {
    res.send(req.app.get.MyAppMidW(req.header('auth-header'))); //The problem
  }
  else {
    res.send(req.app.get('defaultData')); //This works
  }
});

错误信息包括“$middleware is not a function”和“$middleware is not defined”。

解决方案

/app.js

app.MyAppMidW = function (req) {
  queryDB(req);
}

/routes/index.js

router.get("/dbquery", (req, res) => {
  if (req.header('auth-header')) {
    req.app.MyAppMidW(req.header('auth-header'))); //Makes a database query
    res.send(req.app.get('defaultData')); //Fetches database query result
  }
  else {
    res.send(req.app.get('defaultData'));
  }
});

【问题讨论】:

  • 根据你的方案,这不是中间件吗?它只是一个接受 auth 标头的函数。它不需要是app.MyAppMidW,您可以在文件中定义它并将其导入到需要的路由中(var MyAppMidW = require('./MyAppMidW');
  • 可能。原始范围已更改,因此对我来说很难说。此函数在 app.js 中还有其他依赖项。我对这个词的使用不是很准确。

标签: javascript node.js express middleware


【解决方案1】:

如果你这样做

     app.use(MyAppMidW);

每个请求都会查询您的数据库,这不是您想要的。我猜你使用的是 MVC 设计模式。

在你的路由文件夹中,你有这样的东西:

  import appController from "../controllers/app.js"
  router.get("/dbquery", appController.MyAppQuery)

在您的controllers 文件夹中,您有查询数据库的逻辑

  exports.MyAppQuery = (req, res){
     //If u use mongodb for example
    YourModel.find().then(data => {
       res.json(data)
    })
  }

【讨论】:

  • 谢谢,我会考虑的。我没有想到设计模式。仅供参考,我正在使用带有 Core SQL API 的 Azure Cosmos DB
  • 在这里我发现了一些东西npmjs.com/package/@azure/cosmos 你需要将你的查询代码放入你的控制器逻辑中进行查询
【解决方案2】:

您需要调用app.set("MyAppMidW", MyAppMidW),然后才能使用get。或者在 app.js 文件中执行此操作

app.MyAppMidW = function (req, res, next) {
  res.send(queryDB(req));
  next()
}

然后在路由文件中通过req.app.get('MyAppMidW')(req.header('auth-header'))req.app.MyAppMidW(req.header('auth-header')) 调用它。

但是当你说app.use(MyAppMidW) 时会自动调用中间件,默认情况下每个请求都会调用该函数。所以不需要在路由器函数中显式调用它。

【讨论】:

  • 谢谢!我更改了 app.js(app.function 而不是 var 和 app.use)以反映您的建议。我还更改了 index.js 以使用“req.app.MyAppMidW(req.header('auth-header'))”。但是仍然有错误:“无法读取未定义类型错误的属性'发送':无法在 Function.app.MyAppMidW (/home/site/wwwroot/app.js:122:7) 读取未定义的属性'发送'”我'将尝试进一步排除故障。
  • 所以事实证明从 app.MyAppMidW 中删除了不必要的参数修复了这个问题。还将数据库查询(使用此)和查询结果获取(使用 app.get)分开。
猜你喜欢
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 2020-09-25
  • 1970-01-01
相关资源
最近更新 更多