Не удается открыть файл ключей SSL на сервере Node - ENOENT

Я пытаюсь развернуть проект, который я унаследовал на heroku, используя grunt buildcontrol впервые. Хотя я могу собрать и развернуть, при запуске я получаю сообщение об ошибке:

ENOENT: нет такого файла или каталога, откройте 'ssl/keys/server.key'

Проверка каталога dist, действительно, нет каталога ssl. Таким образом, я добавил его в / dist безрезультатно. Думая, что app.js внутри / dist / server / может быть ограничен этим каталогом, я скопировал туда каталог ssl - опять та же проблема. Внутри /dist/server/app.js:

var options = {
  key: fs.readFileSync('ssl/keys/server.key'),
  cert: fs.readFileSync('ssl/keys/server.crt')
};

// Setup server
var app = express();
var server = require('https').createServer(options, app);

Где он будет искать каталог ssl, если не внутри папки сервера?

3 ответа

Решение

readFileSync Функция оценивает относительные пути к текущему рабочему каталогу исполняемого файла узла, который на Heroku /app, а не папка dist. Чтобы получить доступ к вашей папке dist как относительный путь, вы должны использовать path.resolve:

var path = require('path');
var options = {
  key: fs.readFileSync(path.resolve('dist/ssl/keys/server.key')),
  cert: fs.readFileSync(path.resolve('dist/ssl/keys/server.crt'))
};

Альтернативы включают в себя:

  • fs.readFileSync(__dirName + '/dist/ssl/keys/server.key')
  • fs.readFileSync(process.cwd() + '/dist/ssl/keys/server.key')
  • fs.readFileSync(path.join(__dirName, 'dist', 'ssl', 'keys', 'server.key'))

Но я чувствую, что path.resolve является правильной смесью краткой и надежной.

Вы можете использовать переменную "__dirname" для доступа к пути к каталогу вашего приложения, если у вас есть app.js рядом с вашей папкой dist, где есть ключи /ssl/, она будет выглядеть так:

var options = {
  key: fs.readFileSync(__dirname + '/dist/ssl/keys/server.key'),
  cert: fs.readFileSync(__dirname + '/dist/ssl/keys/server.crt')
};

// Setup server
var app = express();
var server = require('https').createServer(options, app);

Думая, что app.js внутри / dist / server / может быть ограничен этим каталогом, я скопировал туда каталог ssl.

Когда вы входите __dirname в app.js ты получишь /dist/server,

Вы сохранили свой ssl каталог в /dist/server,

Так что ваши key путь /dist/server/ssl/keys/server.key и ваш cert путь /dist/server/ssl/keys/server.crt

Ваш код должен быть:

var options = {
  key: fs.readFileSync(__dirname + '/ssl/keys/server.key'),
  cert: fs.readFileSync(__dirname + '/ssl/keys/server.crt')
};

Если вы храните ssl каталог в /dist:

ваш key путь /dist/ssl/keys/server.key и ваш cert путь /dist/ssl/keys/server.crt

Теперь ваш код должен быть:

var options = {
  key: fs.readFileSync(__dirname + '/../ssl/keys/server.key'),
  cert: fs.readFileSync(__dirname + '/../ssl/keys/server.crt')
};

Я использую то же самое на одном из моих проектов, и он отлично работает без использования path.resolve или же path.join, Даже ../ представление родительского каталога разрешается fs.readFileSync сам.

Для функции readFileSync необходим относительный путь, поэтому вы можете использовать модуль path, чтобы получить относительный путь ключей.

var path = require('path');

var options = {
  key: fs.readFileSync(path.join(path.resolve('.'), '/ssl/keys/server.key')),
  cert: fs.readFileSync(path.join(path.resolve('.'), '/ssl/keys/server.crt'))
};
Другие вопросы по тегам