web-dev-qa-db-ja.com

Node server-ENOENTでSSLキーファイルを開くことができません

Grunt buildcontrolを使用して、herokuに継承したプロジェクトを初めてデプロイしようとしています。ビルドしてデプロイすることはできますが、実行するとエラーが発生します。

ENOENT:そのようなファイルまたはディレクトリはありません。「ssl/keys /server.key」を開きます。

Distディレクトリを確認すると、実際にはsslディレクトリはありません。したがって、私はそれを/ distに追加しましたが無駄になりました。/dist/server /内のapp.jsがそのディレクトリにスコープされている可能性があると考えて、そこに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ディレクトリを検索しますか?

14
Eric H

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_は簡潔で堅牢なものの正しいブレンドだと思います。

9
heenenee

/ ssl/keysがあるdistフォルダーの横にapp.jsがある場合は、「__ dirname」変数を使用してアプリのディレクトリパスにアクセスできます。次のようになります。

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);

/ dist/server /内のapp.jsがそのディレクトリにスコープされている可能性があると考えて、そこにsslディレクトリをコピーしました。

__dirnameapp.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')
};

私は自分のプロジェクトの1つで同じものを使用していますが、path.resolveまたはpath.joinを使用しなくても正常に動作します。 ../親ディレクトリ表現でさえ、fs.readFileSync自体によって解決されます。

0
Anand S

ReadFileSync関数には相対パスが必要なので、パスモジュールを使用してキーの相対パスを取得できます。

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'))
};
0