2015-01-21 3 views
5

Ich bin Anfänger im Bereich der Knoten js.No Vorstellung davon, wie einfache Anfrage von url Wie senden: - http://localhost:9999/xyz/inde.html meine Dateihierarchie istKnoten selbst kann statische Dateien ohne Express oder irgendein anderes Modul liefern ..?

server.js 
xyz(folder)- 
      |->index.html 

und die HTML-Seite von meinem server.Which bekommen läuft bei der Post 9999

var http = require("http"); 
function onRequest(request, response) { 
console.log("Request received."); 
response.writeHead(200, {"Content-Type": "text/plain"}); 
response.end(); 
} 
http.createServer(onRequest).listen(9999); 
console.log("Server has started."); 

ich weiß, ich String (mit hTML-Template) vom Knoten js Server es als Antwort und senden, aber wie Datei ohne ausdrückliche zu senden und zu allen anderen externen Modul senden kann. Danke

+1

NodeJS dienen keine Dateien/URLs standardmäßig. Sie müssen einen Server starten und dann Code installieren (Ihren eigenen Code oder eine der vielen Bibliotheken, die dafür erstellt wurden), um die Pfade und Dateinamen zu bearbeiten, auf die Ihr Server reagieren soll. Wenn Sie möchten, können Sie diesen Code selbst von Grund auf schreiben, aber da er viele Male von anderen geschrieben und getestet wurde, verwenden die meisten Leute ein Prebuit-Modul und konfigurieren dann dieses Modul, um die Dateien zu liefern, die sie bedienen sollen. – jfriend00

+0

Danke, So Knoten selbst kann kein Modul für Dateien bereitstellen. – squiroid

+0

nodejs ist modular. Es gibt viele Module zum Versorgen von Dateien. Sie wählen eines dieser Module aus, laden es (wahrscheinlich von NPM) und verwenden es oder Sie schreiben Ihren eigenen Code von Grund auf neu. So funktioniert die Entwicklung von nodejs und all die vorgefertigten Module sind eine seiner großen Stärken als Plattform. Ich habe keine Ahnung, warum Sie vermeiden möchten, vorentwickelte Tools zu verwenden, die Ihre Probleme bereits lösen. – jfriend00

Antwort

3

Es ist lächerlich zu versuchen, eine Knoten-Anwendung ohne npm Abhängigkeiten zu erstellen, weil die Basis von nodejs ist genau das - eine Basis. Wenn Sie keine vollständigen Protokolle implementieren möchten, verwenden Sie am besten ein minimales, gut gepflegtes Modul, das das für Sie erledigt. Das heißt, hier ist die sehr einfache Sache, die Sie gefragt (ohne Mime, ETags, Caching, etc, etc):

var basePath = __dirname; 
var http = require('http'); 
var fs = require('fs'); 
var path = require('path'); 

http.createServer(function(req, res) { 
    var stream = fs.createReadStream(path.join(basePath, req.url)); 
    stream.on('error', function() { 
     res.writeHead(404); 
     res.end(); 
    }); 
    stream.pipe(res); 
}).listen(9999); 
+1

Dieser Code ist anfällig für Pfadüberquerungen. Setzen Sie den Code oben in server.js. Dann versuchen Sie http: // localhost: 9999/server.js – Erlend

+1

Als nächstes, run: telnet localhost 9999 [enter] GET /../../../../../../etc/passwd HTTP /1.1eingeben] [enter] – Erlend

+2

Natürlich ist es. Es verwendet offensichtlich 'path.join' und liest ohne Validierung von irgendetwas. Es wird bereits gesagt, dass dies eine lächerliche und sehr einfache Sache ist. Jeder wäre besser in der Lage, eine Bibliothek zu benutzen, die sich darum kümmert. Aber wenn Sie das Gefühl haben, dass es eine Bearbeitung verdient, dann sollten Sie es unbedingt tun. –

0

seine sehr einfach, Knoten bereits fs-Modul, aus dem zur Verfügung stellen u, dass HTML Datei lesen können und fügen Sie auf Antwort obj wie folgt aus:

response.writeHead(200, {"Content-Type": "text/plain"}); 
//here is the code required 
fs.readFile("./xyz/index.html", (err,fileContent) => 
{ 
    response.end(fileContent); 
}); 

aber das Problem hier ist, dass Sie nur das HTML-Dokument erhalten nicht die Ressourcen innerhalb dass HTML-Dateien, die in verschiedenen Ordnern wie gespeichert werden, wenn Sie diesen Code in Ihr Index.html

<link rel="stylesheet" href="../css/index.css" />

Diese index.css wird vom Knotenserver nicht zugelassen. Aber ich denke deine Frage ist gelöst.

0

const http = require('http'); 
 
const fs = require("fs"); 
 
const path = require("path"); 
 

 
function send404(response){ 
 
    response.writeHead(404, {'Content-Type': 'text/plain'}); 
 
    response.write('Error 404: Resource not found.'); 
 
    response.end(); 
 
} 
 

 
const mimeLookup = { 
 
    '.js': 'application/javascript', 
 
    '.html': 'text/html' 
 
}; 
 

 
const server = http.createServer((req, res) => { 
 
    if(req.method == 'GET'){ 
 

 
    let fileurl; 
 
    if(req.url == '/'){ 
 
     fileurl = 'index.html'; 
 
    }else{ 
 
     fileurl = req.url; 
 
    } 
 
    let filepath = path.resolve('./' + fileurl); 
 

 
    let fileExt = path.extname(filepath); 
 
    let mimeType = mimeLookup[fileExt]; 
 

 
    if(!mimeType) { 
 
     send404(res); 
 
     return; 
 
    } 
 

 
    fs.exists(filepath, (exists) => { 
 
     if(!exists){ 
 
     send404(res); 
 
     return; 
 
     } 
 

 
     res.writeHead(200, {'Content-Type': mimeType}); 
 
     fs.createReadStream(filepath).pipe(res); 
 

 
    }); 
 

 
    } 
 
}).listen(3000); 
 
console.log("Server running at port 3000");

Verwandte Themen