Маршрутизация на основе поддоменов (хостов) в Express - PullRequest
0 голосов
/ 20 февраля 2019

Я уже некоторое время гуглю, но не могу найти полезных ответов.Я пытаюсь получить поддомен для API на моем сайте api.example.com.Однако во всех ответах говорилось, что мне нужно изменить DNS для перенаправления с api.example.com на example.com/api, чего я не хочу.Можно ли просто обслуживать api. вместо перенаправления на /api?Как мне это сделать?

  1. Я использую экспресс.
  2. Я не хочу использовать другие пакеты, которые не являются встроенными.
const path = require('path'),
      http = require('http'),
      https = require('https'),
      helmet = require('helmet'),
      express = require('express'),
      app = express();

const mainRouter = require('./routers/mainRouter.js');

// security improvements
app.use(helmet());

// main pages
app.use('/', mainRouter);

// route the public directory
app.use(express.static('public'));

app.use(/* API subdomain router... */)

// 404s
app.use((req, res) => {
    res.status(404).sendFile(path.join(__dirname, "views/404.html"));
})

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Я рекомендую Вам использовать nginx и отдельный API-сервис.

Но по некоторым причинам Вы не можете этого избежать (или Вы этого не хотите, потому что Вы просто хотите показать прототип клиенту как можно скорее).

В качестве примера вы можете написать промежуточное программное обеспечение, которое будет перехватывать хост из заголовка и пересылать на некоторый пользовательский маршрутизатор:

1) /middlewares/forwardForSubdomain.js:

module.exports = 
    (subdomainHosts, customRouter) => {
      return (req, res, next) => {
        let host = req.headers.host ? req.headers.host : ''; // requested hostname is provided in headers
        host = host.split(':')[0]; // removing port part

        // checks if requested host exist in array of custom hostnames
        const isSubdomain = (host && subdomainHosts.includes(host));
        if (isSubdomain) { // yes, requested host exists in provided host list
          // call router and return to avoid calling next below
          // yes, router is middleware and can be called
          return customRouter(req, res, next); 
        }

        // default behavior
        next();
      }
    };

2) API-маршрутизатор/routers/apiRouter.js:

const express = require('express');
const router = express.Router();

router.get('/users', (req, res) => {
  // some operations here
});

module.exports = router;

3) подключить промежуточное программное обеспечение перед обработчиком /:

const path = require('path'),
      http = require('http'),
      https = require('https'),
      helmet = require('helmet'),
      express = require('express'),
      app = express();

const mainRouter = require('./routers/mainRouter');

// security improvements
app.use(helmet());

// ATTACH BEFORE ROUTING
const forwardForSubdomain = require('./middlewares/forwardForSubdomain');
const apiRouter = require('./routers/apiRouter');
app.use(
  forwardForSubdomain(
    [
      'api.example.com',
      'api.something.com'
    ],
    apiRouter
  )
);

// main pages
app.use('/', mainRouter);

// route the public directory
app.use(express.static('public'));

// 404s
app.use((req, res) => {
    res.status(404).sendFile(path.join(__dirname, "views/404.html"));
})

PS Это то же самое, что и в пакете express-vhost , посмотрите на код

0 голосов
/ 20 февраля 2019

Определенно можно будет указать только поддомен (api.example.com) на ваш сервер api.

DNS не контролирует подкаталоги, поэтому запись DNS example.com/api будет недействительной

Если у вас есть IP-адрес для вашего сервера, вам нужно будет добавить запись A со значением: api.example.com.

Если у вас есть доменное имя для вашего сервера, вам нужно будет создатьЗапись CNAME.

...