node.js - 使用node.js:作为一个简单的web服务器

  显示原文与译文双语对照的内容

我想运行一个非常简单的HTTP服务器。 example.com的每个请求都应该得到 index.html 服务,但作为一个普通的HTML页面( 例如,与阅读普通网页时相同) 。

使用下面的代码,我可以读取 index.html的内容。 如何将 index.html 作为常规网页服务?


var http = require('http');
var fs = require('fs');
var index = fs.readFileSync('index.html');

http.createServer(function (req, res) {
 res.writeHead(200, {'Content-Type': 'text/plain'});
 res.end(index);
}).listen(9615);


于每个资源( CSS,JavaScript,图像) 相关文件我想use,下面有一条建议是复杂,并要求让我写一个 get 向前移动一行

如何使用一些图像,CSS和JavaScript为单个HTML页面提供服务?

时间:

通过为 this, node.js 你可以使用连接ServeStatic :

  1. 用NPM安装连接和 serve-static

    
    $ npm install connect serve-static
    
    
  2. 使用以下内容创建 server.js 文件:

    
    var connect = require('connect');
    var serveStatic = require('serve-static');
    connect().use(serveStatic(__dirname)).listen(8080);
    
    
  3. 用 Node.js 运行

     
    $ node server.js
    
     

你现在可以转到 http://localhost:8080/yourfile.html

查看这里标题 。 我在这里复制它供参考,但它的要点已经被定期更新。

Node.JS 静态文件站点服务器。 将它放在你的路径,在任何目录中启动服务器,使用一个可选的端口参数。


var http = require("http"),
 url = require("url"),
 path = require("path"),
 fs = require("fs"),
 port = process.argv[2] || 8888;

http.createServer(function(request, response) {

 var uri = url.parse(request.url).pathname
, filename = path.join(process.cwd(), uri);

 path.exists(filename, function(exists) {
 if(!exists) {
 response.writeHead(404, {"Content-Type":"text/plain"});
 response.write("404 Not Foundn");
 response.end();
 return;
 }

 if (fs.statSync(filename).isDirectory()) filename += '/index.html';

 fs.readFile(filename,"binary", function(err, file) {
 if(err) { 
 response.writeHead(500, {"Content-Type":"text/plain"});
 response.write(err +"n");
 response.end();
 return;
 }

 response.writeHead(200);
 response.write(file,"binary");
 response.end();
 });
 });
}).listen(parseInt(port, 10));

console.log("Static file server running atn => http://localhost:" + port +"/nCTRL + C to shutdown");

更新

要点是处理css和js文件。 我自己使用了它。在"二进制"模式中使用读/写不是一个问题。 在 response,,它只说明了文件由文件库,是与法不解释为文本 Content-Type 以及人类。

代码的问题是,你总是返回一个 Content-Type的"文本/纯文本"。 上面的代码不返回任何 Content-Type,但是如果你只是将它用于 HTML,CSS和 JS,浏览器就可以推断出那些很好的。 Content-Type is比一个错误的好。

通常 Content-Type 是你的网络服务器的配置。 所以我很抱歉如果这并不解决你 问题,但对我来说它工作了作为一个简单的开发服务器,公司猜测它可能帮助了其他人。 如果你确实需要纠正content-types既在响应中,你需要显式地将它的定义为joeytwiddle拥有或者使用一个库( 如连接,具有合理的默认值。 关于这一点的好处是它是简单和自包含的( 无依存关系) 。

但我觉得你的问题。 这是一个组合的解决方案。


var http = require("http"),
 url = require("url"),
 path = require("path"),
 fs = require("fs")
 port = process.argv[2] || 8888;

http.createServer(function(request, response) {

 var uri = url.parse(request.url).pathname
, filename = path.join(process.cwd(), uri);

 var contentTypesByExtension = {
 '.html':"text/html",
 '.css':"text/css",
 '.js':"text/javascript"
 };

 path.exists(filename, function(exists) {
 if(!exists) {
 response.writeHead(404, {"Content-Type":"text/plain"});
 response.write("404 Not Foundn");
 response.end();
 return;
 }

 if (fs.statSync(filename).isDirectory()) filename += '/index.html';

 fs.readFile(filename,"binary", function(err, file) {
 if(err) { 
 response.writeHead(500, {"Content-Type":"text/plain"});
 response.write(err +"n");
 response.end();
 return;
 }

 var headers = {};
 var contentType = contentTypesByExtension[path.extname(filename)];
 if (contentType) headers["Content-Type"] = contentType;
 response.writeHead(200, headers);
 response.write(file,"binary");
 response.end();
 });
 });
}).listen(parseInt(port, 10));

console.log("Static file server running atn => http://localhost:" + port +"/nCTRL + C to shutdown");

我认为你现在缺少的部分是你正在发送:


Content-Type: text/plain

如果你希望网页浏览器呈现 HTML,你应该将它的更改为:


Content-Type: text/html

步骤( 内部命令提示 [I hope you cd to your FOLDER] ): npm install express

步骤 2: 创建一个文件 server.js


var fs = require("fs");
var host ="127.0.0.1";
var port = 1337;
var express = require("express");

var app = express();
app.use(app.router);//use both root and other routes below
app.use(express.static(__dirname +"/public"));//use static files in ROOT/public folder

app.get("/", function(request, response){//root dir
 response.send("Hello!!");
});

app.listen(port, host);

请注意,你应该添加 WATCHFILE ( 或者使用 nodemon ) 。 上代码仅用于简单连接服务器。

步骤 3: node server.js 或者 nodemon server.js

如果你只想要简单的HTTP服务器,现在就有更简单的方法了。 npm install -g http-server

并打开我们的目录并键入 http-server

https://www.npmjs.org/package/http-server

你不需要 express 。你不需要连接。 node.js 本地执行 http 。你所需要做的就是返回一个依赖于请求的文件:


var http = require('http')
var url = require('url')
var fs = require('fs')
var baseDirectory = __dirname//or whatever base directory you want

http.createServer(function (request, response) {
 var requestUrl = url.parse(request.url)
 var fsPath = baseDirectory+requestUrl.pathname

 fs.exists(fsPath, function(exists) {
 try {
 if(exists) {
 response.writeHead(200)
 fs.createReadStream(fsPath).pipe(response)//do NOT use fs's sync methods (e.g readFileSync) ANYWHERE on production
 } else {
 response.writeHead(500)
 }
 } finally {
 response.end()//inside finally so errors don't make browsers hang
 } 
 })
}).listen(9615)

我认为从字典中查找内容类型,而不是处理 switch 语句,这一点更简单:


var contentTypesByExtension = {
 'html':"text/html",
 'js':"text/javascript"
};

...

 var contentType = contentTypesByExtension[fileExtension] || 'text/plain';

这基本上是连接版本 3所接受答案的更新版本:


var connect = require('connect');
var serveStatic = require('serve-static');

var app = connect();

app.use(serveStatic(__dirname, {'index': ['index.html']}));
app.listen(3000);

我还添加了一个默认选项,以便 index.html 作为默认选项。

编辑:

Node.js 示例应用程序节点聊天具有你想要的功能。
它是 README.textfile
3 。你正在寻找的步骤。

步骤步骤

  • 创建一个在端口 8002上使用 hello helloworld responds响应的服务器

第二步

  • 创建一个 index.html 并服务它

第2

  • 引入 util.js
  • 更改逻辑,使任何静态文件都可以使用
  • 在没有找到文件的情况下显示 404

step4

  • 添加 jquery-1.4.2.js
  • 添加 client.js
  • 更改 index.html 以提示用户输入昵称

下面是 server.js

下面是 util.js

我使用下面的代码来启动一个简单的web服务器,如果没有在Url中提到的文件,它会呈现默认的html文件。


var http = require('http'),
fs = require('fs'),
url = require('url'),
rootFolder = '/views/',
defaultFileName = '/views/5 Tips on improving Programming Logic Geek Files.htm';


http.createServer(function(req, res){

 var fileName = url.parse(req.url).pathname;
//If no file name in Url, use default file name
 fileName = (fileName =="/")? defaultFileName : rootFolder + fileName;

 fs.readFile(__dirname + decodeURIComponent(fileName), 'binary',function(err, content){
 if (content!= null && content!= '' ){
 res.writeHead(200,{'Content-Length':content.length});
 res.write(content);
 }
 res.end();
 });

}).listen(8800);

它将渲染所有的js,css和图像文件,以及所有的html内容。

同意声明" Content-Type is优于错误的one"

...