无法在节点服务器中打开SSL密钥文件 - ENOENT

Eri*_*c H 10 ssl heroku node.js grunt-build-control

我正在尝试使用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);
Run Code Online (Sandbox Code Playgroud)

如果不在服务器文件夹中,它将在哪里寻找ssl目录?

hee*_*nee 11

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'))
};
Run Code Online (Sandbox Code Playgroud)

替代方案包括:

  • 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是简洁和强大的正确融合.