Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 无法打开节点服务器中的SSL密钥文件-eNONT_Node.js_Ssl_Heroku_Grunt Build Control - Fatal编程技术网

Node.js 无法打开节点服务器中的SSL密钥文件-eNONT

Node.js 无法打开节点服务器中的SSL密钥文件-eNONT,node.js,ssl,heroku,grunt-build-control,Node.js,Ssl,Heroku,Grunt Build Control,我正试图第一次使用grunt buildcontrol部署一个继承给heroku的项目。虽然我能够构建和部署,但在运行时我会遇到一个错误: eNote:没有这样的文件或目录,请打开“ssl/keys/server.key” 检查dist目录,实际上没有ssl目录。因此,我已将其添加到/dist,但没有任何效果。考虑到/dist/server/中的app.js可能是该目录的作用域,我将ssl目录复制到了那里——同样的问题。在/dist/server/app.js的内部: var options =

我正试图第一次使用grunt buildcontrol部署一个继承给heroku的项目。虽然我能够构建和部署,但在运行时我会遇到一个错误:

eNote:没有这样的文件或目录,请打开“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目录?

节点可执行文件的
readFileSync
函数,在Heroku上是
/app
,而不是dist文件夹。要以相对路径访问dist文件夹,应使用:

备选方案包括:

  • fs.readFileSync(\uu dirName+'/dist/ssl/keys/server.key')
  • fs.readFileSync(process.cwd()+'/dist/ssl/keys/server.key')
  • fs.readFileSync(path.join(\uu dirName,'dist','ssl','keys','server.key'))
但我觉得
path.resolve
是简洁和健壮的完美结合

考虑到/dist/server/中的app.js可能是该目录的作用域,我将ssl目录复制到了那里

当您在
app.js
中登录
\uuu dirname
时,您将获得
/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')
};
var options = {
  key: fs.readFileSync(__dirname + '/../ssl/keys/server.key'),
  cert: fs.readFileSync(__dirname + '/../ssl/keys/server.crt')
};
如果将
ssl
目录存储在
/dist
中:

您的
密钥
路径是
/dist/ssl/keys/server.key
,您的
证书
路径是
/dist/ssl/keys/server.crt

现在,您的代码应该是:

var options = {
  key: fs.readFileSync(__dirname + '/ssl/keys/server.key'),
  cert: fs.readFileSync(__dirname + '/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
本身解析。

您可以使用“\uu dirname”变量访问应用程序的目录路径,如果您的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);

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