服务器作为linux服务启动时,readFileSync引发错误

我正在尝试使用运行在数字海洋上的节点/快递服务器为自己做一个简单的API。 在服务器文件中我有这样的东西:

var data = fs.readFileSync('path/to/data.json','utf8'); 

当我从cmd行手动启动服务器时,它工作得很好

 node server 

但是我设置的是一个linux服务,所以每次我重新启动我的数字海洋机器,它会自动启动服务器,服务(保存在etc / init /)看起来像这样:

 start on filesystem and started networking respawn exec node /path/to/server.js 

问题是,当我向运行readFileSync调用的服务器发出请求时,如果服务器已经从cmd行手动启动,但是通过服务启动服务器,那么readFileSync将引发以下错误:

 Error: ENOENT, no such file or directory 'path/to/data.json' at Error (native) at Object.fs.openSync (fs.js:500:18) at Object.fs.readFileSync (fs.js:352:15) 

该文件和目录确实存在(如果我在我的浏览器中直接请求data.json文件,我可以看到它)

我错过了什么? 有什么关于启动服务器作为与使用readFileSync冲突的服务? 有什么我想要做的替代方法? 我应该使用某种请求/获取资源模块来访问该json文件吗?

您正在使用相对path,但该stream程并未从您认为的位置开始。 而不是使用相对path,使用绝对path。

所以如果你的布局看起来像:

 server.js
path/
  至/
     data.json

然后在你的server.js中,你可以做一些事情:

 var path = require('path'); // ... var data = fs.readFileSync(path.join(__dirname, 'path/to/data.json'), 'utf8');