2015-01-21 38 views
5

我在節點js.No思想領域初學者如何從URL 像發送簡單的要求: - http://localhost:9999/xyz/inde.html 我的文件層次是節點本身可以​​提供靜態文件,無需使用快速或任何其他模塊..?

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

,並從我的server.Which HTML頁面運行在後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."); 

我知道我可以從節點JS服務器發送字符串(具有HTML模板)和響應,但如何發送文件,而不快遞和任何其他外部模塊發送。 謝謝

+1

的NodeJS默認不提供任何文件/網址。您必須啓動服務器,然後安裝一些代碼(您自己的代碼或爲此構建的許多庫),以處理您希望服務器響應的任何路徑/文件名。如果你願意,你可以從頭開始編寫這些代碼,但由於它已經被其他人編寫和測試過很多次,所以大多數人使用pre-buit模塊,然後配置該模塊來提供他們想要提供的文件。 – jfriend00 2015-01-21 07:09:41

+0

謝謝,所以節點本身不能提供任何文件模塊。 – squiroid 2015-01-21 07:22:03

+0

nodejs是模塊化的。存在許多用於提供文件的模塊。您可以選擇其中一個模塊,加載它(可能來自NPM)並使用它,或者從頭開始編寫自己的代碼。這就是nodejs開發的工作原理,所有預建模塊都是其作爲平臺的強大優勢之一。我不知道爲什麼你要避免使用已經解決了你的問題的預先開發的工具。 – jfriend00 2015-01-21 07:32:54

回答

3

嘗試創建節點應用程序時沒有npm依賴關係是很荒謬的,因爲nodejs的基礎就是這樣 - 基礎。除非您想要實施整個協議,否則最好使用最小的,維護良好的npm模塊,它可以幫助您實現這一目標。這就是說,這裏是你問的非常基本的東西(不包括MIME,ETag的,緩存,等等等等):

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

此代碼易受路徑遍歷影響。將上面的代碼放在server.js中。然後嘗試http:// localhost:9999/server.js – Erlend 2016-01-19 08:31:42

+1

接下來,運行: telnet localhost 9999 [enter] GET /../../../../../../etc/passwd HTTP /1.1[enter] [enter] – Erlend 2016-01-19 08:46:16

+2

當然是了。它公然使用'path.join'並讀取而不驗證任何東西。已經說過這是一個荒謬而非常基本的東西。任何人都會更好地使用一個照顧這一切的圖書館。但是,如果你覺得它值得編輯,無論如何,去做吧。 – 2016-01-19 13:24:51

0

它很簡單,節點已經提供了FS模塊從其中U可以讀取HTML 文件和響應追加 OBJ這樣的:

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

但這裏的問題是,你將只能得到的HTML文件中存儲的一樣,如果你有這樣的代碼在 不同的文件夾是HTML文件內 不是資源您的index.html

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

該index.css將不被節點服務器允許。 但我想你的問題已解決。

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

相關問題