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

我试图部署一个项目,我第一次使用grunt buildcontrolinheritance到heroku。 虽然我能够构build和部署,但在运行时出现错误:

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目录?

       

网上收集的解决方案 "无法在节点服务器中打开SSL密钥文件 – ENOENT"

readFileSync函数计算相对path到节点可执行文件的当前工作目录 ,在Heroku上是/app ,而不是dist文件夹。 要以相对path访问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')) }; 

替代scheme包括:

  • 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是简洁和强大的混合。

考虑到/ dist / server /里的app.js可能被限制在那个目录下,我把ssl目录复制到了那里。

当你在app.jslogging__dirname ,你将得到/dist/server

您将您的ssl目录存储在/dist/server

所以,你的keypath是/dist/server/ssl/keys/server.key ,你的certpath是/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

你的keypath是/dist/ssl/keys/server.key ,你的certpath是/dist/ssl/keys/server.crt

现在,你的代码应该是:

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

我在我的一个项目上使用相同的,它没有使用path.resolvepath.join工作正常。 甚至../父目录表示也由fs.readFileSync本身解决。

您可以使用“__dirname”variables访问您的应用程序的目录path,如果您的dist文件夹旁边有app.js,那么/ 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);