如何从路由器访问应用程序级中间件?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从路由器访问应用程序级中间件?相关的知识,希望对你有一定的参考价值。

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

中间件用于查询从路由器收到的用户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不是函数”和“ $ middleware未定义”。

解决方案

/ 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'));
  }
});
答案

您需要调用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.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)
    })
  }

以上是关于如何从路由器访问应用程序级中间件?的主要内容,如果未能解决你的问题,请参考以下文章

基于多用户角色的路由级中间件

如何从 Android 中的 Fragment 访问 UI 元素?

在Slim 4中访问中间件中的路由参数。

express中间件

如何从另一个片段访问片段对象

如何在片段中访问 SQLite 数据到 ListView