Переменная HTTP / HTTPS Express Server - PullRequest
0 голосов
/ 08 августа 2011

Я уверен, что это простая проблема с Javascript, но я пробовал несколько разных способов и не могу заставить это работать.

Идея состоит в том, что сервер Express.js по умолчанию использует HTTP с вызовом express.createServer (), но при необходимости переключается на HTTPS при обнаружении . / Conf / cert.pem и. / конф / key.pem .Я использую асинхронные вызовы Node's path.exists () , где второй аргумент обратного вызова содержит логический результат.

В настоящее время они вложены так, что сервер HTTPS не созданпока он не станет «безопасным» (мы знаем результат существования двух файлов или нет), поскольку в противном случае порядок не гарантируется.Однако, как я уже упоминал, я пробовал несколько разных способов, но я не могу изменить внешнюю переменную app .

Я уверен, что есть простое исправление, которое я 'Я не вижу сейчас, но любая помощь будет оценена!

app = module.exports = express.createServer();

path.exists('./conf/key.pem', function(exists){
    var keyExists = exists;
    path.exists('./conf/cert.pem', function(exists) {
        var certExists = exists;
        if (keyExists && certExists) {
             app = express.createServer({
                key: fs.readFileSync('./conf/key.pem'),
                cert: fs.readFileSync('./conf/cert.pem')
              });
         }
    });
});

1 Ответ

3 голосов
/ 08 августа 2011

Это не идеально.Не следует создавать обычный http-сервер только для того, чтобы он был перезаписан https-сервером.Я думаю, что проблема, о которой вы говорите, связана с тем, что вы устанавливаете переменную app ниже, а не module.exports.Таким образом, module.exports все еще относится к исходному созданному серверу.Вот что вы должны сделать:

var app = express.createServer({
  key: fs.readFileSync('./conf/key.pem'),
  cert: fs.readFileSync('./conf/cert.pem')
});
module.exports = app;

Нет причин проверять, существуют ли файлы в первую очередь.Если файлы не существуют, readFileSync просто выбросит ENOENT.Также нет причин делать что-либо асинхронно, прежде чем вы даже войдете в цикл обработки событий.

Я не знаю, почему вы хотите, чтобы ваш сервер был условно https, но чтобы сделать что-то похожее на то, что вы пытались сделать там:

var app;
try {
  app = express.createServer({
    key: fs.readFileSync('./conf/key.pem'),
    cert: fs.readFileSync('./conf/cert.pem')
  });
} catch(e) {
  if (e.code !== 'ENOENT') throw e;
  app = express.createServer();
}
module.exports = app;

Или это может выглядетьприятнее:

var app;
if (path.existsSync('./conf/key.pem')) {
  app = express.createServer({
    key: fs.readFileSync('./conf/key.pem'),
    cert: fs.readFileSync('./conf/cert.pem')
  });
} else {
  app = express.createServer();
}
module.exports = app;

Помните, что синхронно делать все хорошо, если вам не нужно одновременно обслуживать миллион запросов.

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