2015-10-14 66 views
7

我试图部署我第一次使用grunt buildcontrol继承到heroku的项目。虽然我能够构建和部署,但在运行时出现错误:无法在节点服务器中打开SSL密钥文件 - ENOENT

ENOENT: no such file or directory, open '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目录的服务器文件夹中?

回答

7

readFileSync函数evaluates relative paths to the current working directory的节点可执行文件,它在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是righ简洁和强劲的融合。

0

Thinking that app.js inside of /dist/server/ might be scoped to that directory, I copied the ssl directory there.

当您在app.js登录__dirname你会得到/dist/server

您在/dist/server中保存了ssl目录。

所以,你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.resolvepath.join工作正常。甚至../父目录表示由fs.readFileSync本身解决。

1

如果您有应用程序,您可以使用“__dirname”变量访问应用程序的目录路径。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); 
相关问题