проблема express.static () и sendFile () ... создание динамического хоста с помощью nodejs - PullRequest
0 голосов
/ 29 апреля 2019

После настройки моего веб-сервера с помощью nginx я перенаправил все * .example.com на мой сервер nodejs.

Но перед этим я обрабатываю запрос http, проверяю URL и хост, чтобы убедиться, что он правильный или нет.

Например, если пользователь пишет что-то вроде what.ever.example.com Я перенаправил его на основной сайт, потому что этот хост недействителен.

в противном случае, если пользователь пишет что-то вроде mydomain.example.com

Пользователь должен зайти на этот сайт и получить угловое приложение.

Так что я делаю что-то вроде этого.

ОБНОВЛЕННЫЙ КОД

const express = require('express');
const cors = require('cors');
const mongoose = require('./server/database');
const bodyParser = require('body-parser');
const app = express();
var path = require('path');

// Settings
app.set('port', process.env.PORT || 4000)

// Middlewares
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(express.json());
app.use(cors());

// Routes API
app.use('/api/users', require('./server/routes/usuarios.routes'));
app.use('/api/almacenes', require('./server/routes/almacen.routes'))
app.use('/api/updates', require('./server/routes/update.routes'))
app.use('/api/dominios', require('./server/routes/dominios.routes'))

app.get('/', checkHost);
app.get('/', express.static('../nginx/app'));
app.get('/*', checkPath);

function checkHost(req, res, next) {  //With this function what i pretend is check the subdomain that the user send, and if it doesn't exist. redirect it. 
  var domain = req.headers.host
  subDomain = domain.split('.')
  if (subDomain.length == 3) {
    subDomain = subDomain[0].split("-").join(" ");
    let query = { dominio: subDomain }
    var dominiosModel = mongoose.model('dominios');
    dominiosModel.findOne(query).exec((err, response) => {
      if (response != null) {
        if (response.dominio == subDomain) {
          next();
        } else {
          res.writeHead(303, {
            location: 'http://www.example.com/index.html'
          })
          res.end()
        }
      } else {
        res.writeHead(303, {
          location: 'http://www.example.com/index.html'
        })
        res.end()
      }
    })
  } else {
    res.writeHead(303, {
      location: 'http://www.example.com/index.html'
    })
    res.end()
  }
}

function checkPath(req, res, next) { //With this function what i want to do is.. if the user send *.example.com/whatever, i redirect it to *.example.com
  if (req.url !== '/') {
    res.writeHead(303, {
      location: `http://${req.headers.host}`
    })
    res.end()
  } else {
    next()
  }
}



// Starting Server.
app.listen(app.get('port'), () => {
  console.log('Server listening on port', app.get('port'));
});

Все перенаправления работают хорошо, но когда в checkHost совпадает поддомен, он ничего не отправляет на фронт ... так что я могу сделать здесь?

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Функция sendFile требует абсолютного пути к файлу для отправки, если root не указано. Если указан root, можно использовать относительный путь, но сам root должен быть абсолютным. Проверьте документацию здесь: https://expressjs.com/en/api.html#res.sendFile

Вы должны попытаться отправить свой index.html следующим образом:

app.get('*', checkPath, checkHost, function (req, response) {
  response.sendFile('index.html', { root: path.join(__dirname, '../nginx/app') });
}

Это должно работать при условии, что путь ../nginx/app/index.html действителен относительно файла, в котором написан этот код.

Кроме того, основываясь на примере кода (и комментариях), вам, вероятно, вообще не нужен express.static(...). Если вам не нужно обслуживать «другие» файлы статически.

Если это необходимо, то app.use(express.static('../nginx/app')) должен находиться за пределами контроллера. Вероятно, его следует добавить до bodyParser, но, поскольку вы обеспокоены тем, что кто-то может получить доступ к index.html через статическое промежуточное ПО, вы можете рассмотреть следующий порядок для своего промежуточного ПО:

//existing body parser and cors middlewares

// existing /api/* api middlewares. 

app.use(checkPath);
app.use(checkHost);
app.use(express.static('../nginx/app'));

Если промежуточное программное обеспечение checkPath немного изменено для перенаправления на /index.html, промежуточное программное обеспечение с путем '*' может вообще не потребоваться при этой настройке.

1 голос
/ 29 апреля 2019

Попробуйте удалить response.end (). Поскольку .sendFile () принимает обратный вызов, это, скорее всего, асинхронная функция, что означает, что вызов .end () сразу после .sendFile (), скорее всего, приведет к пустому ответу.

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