Не удается получить ожидаемые результаты от включенных файлов в Nodejs - PullRequest
0 голосов
/ 10 апреля 2020

Я не получаю ожидаемых результатов, включая файлы в Nodejs. Вот мой код:

Файл сервисного маршрута

const express = require('express');
const router = express.Router();
const path = require('path');
const config = require('../config');
const serviceAdapter = require('./serviceAdapter');

module.exports = (preRequestPath, serviceBaseUrl) => {

    console.log("On server start", preRequestPath)

    router.post('/*', (req, res) => {

      console.log("On request", preRequestPath)

      const axiosHttp = serviceAdapter(serviceBaseUrl);

      axiosHttp.post(preRequestPath+req.path, req.body).then(resp => {
        res.send(resp.data)
      }).catch(err => {
        res.status(404).sendFile(path.join(__dirname + '/../404.html'));
      });
    });

    return router;
}

Файл основного сервера

const express = require('express');

const userApiService = require('./routes/userService');
const userAdminService = require('./routes/userService');

app.use('/api/user_service/', userApiService("/api", config.userServiceUrl) );
app.use('/admin/user_service/', userAdminService("/admin", config.userServiceUrl) );

var server = app.listen(3000, function(){
  console.log('Server listening on port 3000');
});

module.exports = server;

Ожидаемый результат консоли:

On server start /api
On server start /admin

On request /api         (when hitting http://baseurl.com/api/<anything>)
On request /admin       (when hitting http://baseurl.com/admin/<anything>)

Но получение консоли выводится как:

On server start /api
On server start /admin

On request /api         (when hitting http://baseurl.com/api/<anything>)
On request /api       (when hitting http://baseurl.com/admin/<anything>)

Оба времени, возвращая / api путь. Может кто-нибудь сказать мне, почему это происходит и каково решение?

1 Ответ

2 голосов
/ 10 апреля 2020

Вы создаете только один маршрутизатор в userService.js (первый файл). Он создается один раз перед функцией, поэтому у вас действительно только один маршрутизатор. В первый раз, когда вы require создаете маршрутизатор, но во второй раз, когда require этот узел узнает, что он уже загружен и он не инициализирован повторно. Для каждого случая вы должны создавать разные маршрутизаторы, например:

const express = require('express');
// const router = express.Router();  <-- don't do it here
const path = require('path');
const config = require('../config');
const serviceAdapter = require('./serviceAdapter');

module.exports = (preRequestPath, serviceBaseUrl) => {
  const router = express.Router();  // <--- create a new router for each case
  console.log("On server start", preRequestPath)

  router.post('/*', (req, res) => {
    console.log("On request", preRequestPath)

    const axiosHttp = serviceAdapter(serviceBaseUrl);

    axiosHttp.post(preRequestPath+req.path, req.body).then(resp => {
      res.send(resp.data)
    }).catch(err => {
      res.status(404).sendFile(path.join(__dirname + '/../404.html'));
    });
  });

  return router;
}

Кроме того, в файле вашего основного сервера он требуется только один раз. Это просто функция для создания службы, поэтому вам не нужны 2 разные переменные, содержащие эту функцию. Таким образом, вы можете инициализировать оба с помощью одной функции, как это:

// const userApiService = require('./routes/userService');
// const userAdminService = require('./routes/userService');
const service = require('./routes/userService');

app.use('/api/user_service/', service("/api", config.userServiceUrl) );
app.use('/admin/user_service/', service("/admin", config.userServiceUrl) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...