2016-04-05 11 views
0

Ich entwickle eine Express-Web-Anwendung mit Knoten JS auf Google App Engine Flexible Umgebung (Managed VMs). Grundsätzlich habe ich nur eine statische HTML-Seite, die ich bedienen muss, da alles in Angular JS dynamisch geladen wird.Serve HTML-Datei mit NodeJS und serve-static

Beim Lesen Express best practices habe ich festgestellt, dass sie die Verwendung von res.sendFile, die genau das ist, was ich in der Entwicklung getan habe, entmutigen.

Da ich zur Produktion wechseln möchte, würde ich gerne static-serve wie vorgeschlagen verwenden, aber ich konnte keine Dokumentation finden, die erklärt, wie res.sendFile zu simulieren ist.

Unten finden Sie meinen aktuellen Code.

var app = express(); 
app.use(express.static('www')); 
app.get('/', oauth2.required, function (req, res) { 
// ... 
res.sendFile(path.join(__dirname + '/www/dashboard.html')); 
// ... 
}); 
+0

In der Produktion könnten Sie einen nginx-Server verwenden Sie statische Datei zu dienen und lassen Sie node.js Server den dynamischen Inhalt handhaben. Dies ist normalerweise die am besten optimierte Lösung, um die Anforderungen auf Ihrem node.js-Server zu reduzieren, der für statische Serverdateien langsamer ist als beispielsweise nginx. – Aaleks

+0

Das Problem ist, dass ich auf App Engine Flexible laufen und ich weiß nicht, ob ich Zugriff auf Nginx-Konfiguration habe. – raz3r

+0

Nie verwendet, aber es scheint, dass Sie nach schneller Google-Suche scheint es, dass es möglich ist, Ihre eigene nginx https://cloud.google.com/appengine/docs/flexible/ Infrastructure Customization und https: // Cloud zu installieren. google.com/solutions/https-load-balancing-nginx, aber die standardmäßige Express-Middleware für die Bereitstellung von statischen Dateien wird auch den Trick machen app.use ('/ public', express.static (Pfad.join (__ Verzeichnisname, './public '))); – Aaleks

Antwort

1

Um eine statische Datei dienen Sie einen statischen Ordnerinhalt in Express.js

app.use('/public', express.static(path.join(__dirname, './public'))); 

die, dass alle Dateien in Ihnen öffentliche Ordner als statische Inhalte serviert werden bedeuten können festlegen, wann Sie treffen und URL wie mydomain.com/public/image.png

EDIT: wenn möglich in Ihrer dev Umgebung

Sie können einen nginx-Server verwenden, um eine statische Datei zu verarbeiten, und Sie können den dynamischen Inhalt vom node.js-Server verarbeiten lassen. Dies ist normalerweise die am besten optimierte Lösung, um die Anforderungen auf Ihrem node.js-Server zu reduzieren, der für statische Serverdateien langsamer ist als beispielsweise nginx.

Eine nginx Konfiguration

root /home/myapp; 

    # Add index.php to the list if you are using PHP 
    index index.html index.htm index.nginx-debian.html; 

    server_name _; 

    location /public/ { 
      alias /home/myapp/public/; 
    } 

    location/{ 
      proxy_pass http://IPADRESSOFNODEJSSERVER:8080; 
      proxy_http_version 1.1; 
      proxy_set_header Upgrade $http_upgrade; 
      proxy_set_header Connection 'upgrade'; 
      proxy_set_header Host $host; 
      proxy_cache_bypass $http_upgrade; 
      # First attempt to serve request as file, then 
      # as directory, then fall back to displaying a 404. 
      #try_files $uri $uri/ =404; 
    } 

Jede Anfrage mit/public/am ersten Teil der URL wird sein könnte von nginx und jeder anderen Anfrage Proxy gehandhabt werden Sie App auf Ihrem IPADRESSOFNODEJSSERVER:NODEJSPORT in der Regel der NodeJS IPADRESSOFNODEJSSERVER ist das localhost

die zweite Option NGNIX bezieht sich auf den Abschnitt doc Verwendung

Eine noch bessere Option, u ist Se einen Reverse-Proxy, um statische Dateien zu dienen; Weitere Informationen finden Sie unter Verwenden eines Reverse-Proxy.

http://expressjs.com/en/advanced/best-practice-performance.html#proxy

+0

Ich weiß über die express.static-Funktion, was ich aber nicht weiß ist, wie res.sendFile durch die entsprechende Funktion im "static-serve" -Paket zu ersetzen. – raz3r

+0

Dies ist die richtige Antwort, Sie sollten Ihre eckige App in einen Ordner legen und diesen Ordner dann statisch mit Express bedienen. Auf diese Weise eckig macht seine Sache in der Front und Express kann API-Anrufe, persistente Login usw. behandeln. Dies ist die Art, wie ich meine App building [MEANBoilerPlate] (http://github.com/joeLloyd/MEANBoilerPlate) –