2017-04-16 2 views
0

J'ai un projet NodeJS qui commence par server.js sous/opt/battleship. Si je cd à ce répertoire et tapez le serveur de noeud, tout fonctionne correctement, mais si je suis assis dans/root et utilise un chemin absolu pour le démarrer, comme node /opt/battleship/server, alors tout ce que je sers de ses sous-répertoires ./lib et ./public obtient une réponse 404. Ceci est un problème dans la production parce que mon script /etc/init/battleship.conf spécifie le démarrage du processus de démarrage avecRecherche d'un moyen plus simple d'exécuter NodeJS en tant que service avec des chemins absolus

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

Il fonctionne, mais j'obtenir les 404 erreurs. Si je mets la ligne

cd /opt/battleship 

juste au-dessus dans le fichier battleship.conf, je ne reçois pas 404 erreurs, je reçois tous mes fichiers correctement, mais il semble que si vous utilisez cd dans un fichier .conf est désordonné et sujette aux erreurs. Corrigez-moi si je me trompe, c'est mon premier fichier .conf manuscrit. Existe-t-il une meilleure façon de faire en sorte que mon server.js mette correctement les fichiers à partir de ses sous-répertoires ./lib et ./public? Ci-dessous mon fichier server.js pour référence:

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); 
}); 

Répondre

1

Utilisez __dirname pour obtenir le dossier du script.

Par exemple, si vous voulez obtenir index.html, et il est dans le répertoire du script, utilisez ceci:

var path = require('path'); 

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

qui a été fixé il !. Merci beaucoup! Retrait de la 'cd/opt/battleship' à partir du fichier /etc/init/battleship.conf et changer la ligne de server.js: ' var abspath = './' + filePath; ' à 'var absPath = path.join (__ dirname, filePath);' Fonctionne parfaitement. –