我正在研究EC2实例,并且已将我的节点应用程序项目放在/ var / www /中。我正在使用upstart脚本来启动节点应用程序。 upstart脚本放在/ etc / init /中。在应用程序中,我正在解析如下文件以访问配置变量:
var _conf = JSON.parse(fs.readFileSync('./config/config.json'));
当我使用命令节点app.js在前台运行应用程序时,它可以正常工作。它能够将文件解析为JSON。但是当我运行upstart脚本时,会抛出以下错误。
fs.js:549
return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode);
^
Error: ENOENT: no such file or directory, open './config/config.json'
at Error (native)
at Object.fs.openSync (fs.js:549:18)
at Object.fs.readFileSync (fs.js:397:15)
at Object.<anonymous> (/var/www/machaao-api/node_modules/machaao-kafka/index.js:3:27)
at Module._compile (module.js:435:26)
at Object.Module._extensions..js (module.js:442:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:311:12)
at Module.require (module.js:366:17)
at require (module.js:385:17)
[2015-12-09T07:52:05.257Z] (sys) Starting
以下是我的新贵脚本:
#!upstart
description "API Server"
author "Author"
start on startup
stop on shutdown
respawn
respawn limit 5 20
script
echo "script started..." >> /var/log/project.log
echo $$ > /var/run/project-api.pid
exec node /var/www/project-api/app.js >> /var/log/project-api.log 2>&1
end script
pre-start script
echo "Pre-start script started..."
echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/project-api.log
end script
pre-stop script
echo "Pre-stop script started..."
rm /var/run/project-api.pid
echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/project-api.log
end script
有人可以解释这是什么问题吗?它说没有这样的文件或目录,当我知道它在那里。我是新手linux用户。这是因为一些许可问题吗?
答案 0 :(得分:1)
您可能只需要cd
进入节点目录并从那里开始:
exec cd /var/www/project-api && node app.js >> /var/log/project-api.log 2>&1
您还可以更改应用程序脚本以获取绝对路径,这样您就不需要进入目录:
var fs = require('fs');
var path = require('path');
var _conf = JSON.parse(fs.readFileSync(path.join(__dirname, 'config/config.json')));
console.log(_conf);
答案 1 :(得分:0)
我目前还不确定节点如何解析这样的相对路径所以可能会在解析json之前尝试这样的事情
var path = require('path');
console.log(path.resolve('./config/config.json'));
并查看它是否打印出您希望的绝对路径。