2017-04-16 9 views
0

/opt/battleshipの下にserver.jsで始まるNodeJSプロジェクトがあります。そのディレクトリに移動してノードサーバーをタイプするとすべて正常に動作しますが、/ rootに座って絶対パスを使用して起動すると、node /opt/battleship/serverなど、./libと./publicのサブディレクトリ404応答を取得します。これは生産の問題であり、私の/etc/init/battleship.confスクリプトが絶対パスのNodeJSをサービスとして実行するためのより洗練された方法を探してください

exec /usr/local/bin/node /opt/battleship/server.js >> /var/log/battleship.log 2>&1 

でブート時にプロセスを開始する指定しているのでそれは動作しますが、その後、私は404エラーが発生します。私は

cd /opt/battleship 

だけbattleship.confファイルでその上にラインを入れた場合は.confファイル内のCDを使用しているかのように、私は私が正しく私のすべてのファイルを取得し、404エラーを得ることはありませんが、それはそうです厄介でエラーを起こしやすい私が間違っている場合は私を修正してください。これは私の手書きの.confファイルです。 ./libと./publicのサブディレクトリから正しくserver.jsサーバーにファイルをアップロードする方法がありますか?以下は、参照のための私の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

利用__dirnameスクリプトのフォルダを取得します。あなたがindex.htmlを取得したい、そしてそれは、スクリプトのディレクトリにあるかどう

たとえば、これを使用します。

var path = require('path'); 

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

がそれを固定こと!どうもありがとうございます! /etc/init/battleship.confファイルから 'CDの/ opt/battleship'を削除し、からserver.jsに行を変更: ' VARのABSPATH = './' + filePathに; ' へ 'var absPath = path.join(__ dirname、filePath);' 完全に動作しました。 –

関連する問題