Как получить доступ к промежуточному программному обеспечению уровня приложения с маршрутизатора? - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь получить доступ к своему промежуточному программному обеспечению уровня приложения из маршрутизатора в проекте, созданном с помощью генератора экспресс-приложений.

Промежуточное программное обеспечение используется для запроса базы данных с помощью идентификатора пользователя, полученного от маршрутизатора.

Iчувствую, что я упускаю что-то очень простое (или фундаментальное), но не могу обойти проблему (это мой первый проект Node.js). Поэтому больше, чем лучшая практика, я ищу простое решение

Я пытался использовать различные методы приложения, включая post.

/ app.js

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

/маршруты / 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);
}

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

Ответы [ 2 ]

2 голосов
/ 30 октября 2019

Если вы сделаете это так

     app.use(MyAppMidW);

Каждый запрос будет запрашивать вашу базу данных, а это не то, что вы хотите. Я предполагаю, что вы используете шаблон проектирования MVC.

В вашей папке маршрута у вас есть что-то вроде этого:

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

И в вашей папке controllers у вас есть логика, которая запрашивает db

  exports.MyAppQuery = (req, res){
     //If u use mongodb for example
    YourModel.find().then(data => {
       res.json(data)
    })
  }
0 голосов
/ 30 октября 2019

Вам нужно позвонить 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) функция вызывается по умолчанию при каждом запросе. Поэтому нет необходимости явно вызывать его внутри функции маршрутизатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...