18

我正在尝试第一次使用 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 目录?

4

4 回答 4

23

readFileSync函数评估节点可执行文件的当前工作目录的相对路径/app,在 Heroku 上是,而不是 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是简洁和健壮的正确结合。

于 2016-01-03T02:19:56.463 回答
2

You can use the "__dirname" variable to access to the directory path of your app, if you have the app.js next to your dist folder where there is the /ssl/keys it will look like these:

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);
于 2016-01-03T20:22:07.180 回答
1

考虑到 /dist/server/ 中的 app.js 可能会被限定到该目录,我将 ssl 目录复制到了那里。

当您登录__dirname时,app.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

your key path is /dist/ssl/keys/server.key and your cert path is /dist/ssl/keys/server.crt

Now, your code should be:

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

I am using the same on one of my project and it works fine without using path.resolve or path.join. Even the ../ parent directory representation is resolved by fs.readFileSync itself.

于 2016-01-03T20:11:28.950 回答
0

The readFileSync function needs a relative path so you can use the path module to get the relative path of the keys.

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'))
};
于 2019-07-28T01:06:01.513 回答