我有一个NodeJS项目,以/ opt / battleship下的server.js开头。如果我cd到那个目录并输入节点服务器,一切正常,但如果我坐在/ root并使用绝对路径启动它,例如node /opt/battleship/server
,那么我从它的./lib和./public subdirs获得404响应。这是生产中的问题,因为我的/etc/init/battleship.conf脚本指定在启动时启动进程
exec /usr/local/bin/node /opt/battleship/server.js >> /var/log/battleship.log 2>&1
它运行,但后来我得到404错误。如果我把线
cd /opt/battleship
就在battleship.conf文件中,我没有得到404错误,我正确地获取了所有文件,但似乎在.conf文件中使用cd很麻烦且容易出错。如果我错了,请纠正我,这是我的第一个手写的.conf文件。有没有更好的方法让我的server.js服务器正确地从其./lib和./public子目录中获取文件?下面是我的server.js文件供参考:
var PORT = 3000;
var requirejs = require('requirejs');
var http = requirejs('http');
var fs = requirejs('fs');
var path = requirejs('path');
var mime = requirejs('mime');
var cache = {};
requirejs.config({
baseUrl: __dirname,
nodeRequire: require,
packages: [
{name: 'ship', location: 'public/js/lib/ship'},
{name: 'GameState', location: 'public/js/lib', main: 'GameState'}
]
});
requirejs(['./lib/battleship_server'], function(battleship_server) {
function send404(response) {
response.writeHead(404, {'Content-Type': 'text/plain'});
response.write('Error 404: response not found.');
response.end();
}
function sendFile(response, filePath, fileContents) {
response.writeHead(
200,
{'Content-Type': mime.lookup(path.basename(filePath))}
);
response.end(fileContents);
}
function serveStatic(response, cache, absPath) {
if (cache[absPath]) {
sendFile(response, absPath, cache[absPath]);
} else {
fs.exists(absPath, function(exists) {
if (exists) {
fs.readFile(absPath, function(err, data) {
if (err) {
send404(response);
} else {
cache[absPath] = data;
sendFile(response, absPath, data);
}
});
} else {
send404(response);
}
});
}
}
var server = http.createServer(function(request, response) {
var filePath = false;
if (request.url === '/') {
filePath = 'public/index.html';
} else {
filePath = 'public' + request.url;
}
var absPath = './' + filePath;
serveStatic(response, cache, absPath);
});
server.listen(PORT, function() {
console.log('Server listening on port ' + PORT + '.');
});
battleship_server(server);
});
答案 0 :(得分:1)
使用__dirname
获取脚本的文件夹。
例如,如果您想获取index.html
,并且它位于脚本目录中,请使用:
var path = require('path');
var pathOfIndex = path.join(__dirname, "index.html");