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

时间:2017-04-16 04:51:10

标签: node.js path exec absolute relative

我有一个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);
});

1 个答案:

答案 0 :(得分:1)

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

例如,如果您想获取index.html,并且它位于脚本目录中,请使用:

var path = require('path');

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