Не удается открыть файл ключей 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'))
};