寻找一种更简洁的方法 运行 NodeJS 作为具有绝对路径的服务

Looking for a cleaner way to run NodeJS as a service with absolute paths

我在 /opt/battleship 下有一个以 server.js 开头的 NodeJS 项目。如果我 cd 到该目录并键入节点服务器,一切正常,但如果我坐在 /root 中并使用绝对路径启动它,例如 node /opt/battleship/server,那么我从它的 ./lib 和./public 子目录得到 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);
});

使用__dirname获取脚本的文件夹。

例如,如果你想得到index.html,并且它在脚本的目录中,使用这个:

var path = require('path');

var pathOfIndex = path.join(__dirname, "index.html");