题 使用node.js作为简单的Web服务器
我想运行一个非常简单的HTTP服务器。每个GET请求 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);
下面的一个建议很复杂,需要我写一个 get
我要使用的每个资源(CSS,JavaScript,图像)文件的行。
如何使用一些图像,CSS和JavaScript提供单个HTML页面?
937
2018-05-21 20:44
起源
答案:
您可以使用 连 和 ServeStatic 与Node.js为此:
使用NPM安装connect和serve-static
$ npm install connect serve-static
使用此内容创建server.js文件:
var connect = require('connect');
var serveStatic = require('serve-static');
connect().use(serveStatic(__dirname)).listen(8080, function(){
console.log('Server running on 8080...');
});
使用Node.js运行
$ node server.js
你现在可以去 http://localhost:8080/yourfile.html
862
2017-12-08 08:09
最简单的Node.js服务器就是:
$ npm install http-server -g
现在,您可以通过以下命令运行服务器:
$ cd MyApp
$ http-server
如果您使用的是NPM 5.2.0或更高版本,则可以使用 http-server
没有安装它 npx
。建议不要在生产中使用它,但这是快速获取在localhost上运行的服务器的好方法。
$ npx http-server
或者,您可以尝试此操作,这将打开您的Web浏览器并启用CORS请求:
$ http-server -o --cors
有关更多选项,请查看 的文件 http-server
在GitHub上,或运行:
$ http-server --help
很多其他不错的功能和对NodeJitsu的脑死亡简单部署。
功能分叉
当然,您可以使用自己的分叉轻松实现功能。您可能会发现它已经在此项目的现有800多个分支中的一个中完成:
轻型服务器:自动刷新替代方案
一个不错的选择 http-server
是 light-server
。它支持文件监视和自动刷新以及许多其他功能。
$ npm install -g light-server
$ light-server
在Windows资源管理器中添加到目录上下文菜单
reg.exe add HKCR\Directory\shell\LightServer\command /ve /t REG_EXPAND_SZ /f /d "\"C:\nodejs\light-server.cmd\" \"-s\" \"%V\""
简单的JSON REST服务器
如果您需要为原型项目创建一个简单的REST服务器 JSON-服务器 可能就是你要找的东西。
自动刷新编辑器
大多数网页编辑器和IDE工具现在都包含一个Web服务器,它将监视您的源文件并在更改时自动刷新您的网页。
该 开源 文本编辑器 括号 还包括NodeJS静态Web服务器。只需在Brackets中打开任何HTML文件,按“实时预览“它启动一个静态服务器并在页面上打开浏览器。浏览器将在编辑和保存HTML文件时自动刷新。这在测试自适应网站时特别有用。在多个浏览器/窗口大小上打开HTML页面保存您的HTML页面并立即查看您的自适应内容是否正常工作 所有 自动刷新。
PhoneGap开发人员
如果你正在编码 混合移动应用,你可能有兴趣知道 PhoneGap的团队采用了这种自动更新概念 PhoneGap应用程序。这是一个通用的移动应用程序,可以在开发期间从服务器加载HTML5文件。这是一个非常流畅的技巧,因为现在你可以跳过混合移动应用程序开发周期中的慢速编译/部署步骤,如果你要更改JS / CSS / HTML文件 - 这是你大部分时间都在做的事情。它们还提供静态NodeJS Web服务器(运行 phonegap serve
)检测文件更改。
PhoneGap + Sencha Touch开发者
我现在已经为Sencha Touch和jQuery Mobile开发人员广泛调整了PhoneGap静态服务器和PhoneGap开发者应用程序。看看吧 Sencha Touch Live。支持--qr QR代码和--localtunnel,它将您的静态服务器从您的台式计算机代理到防火墙外的URL!吨的用途。大规模加速混合移动设备。
Cordova + Ionic框架开发人员
本地服务器和自动刷新功能被烘焙到 ionic
工具。赶紧跑 ionic serve
从您的应用程序文件夹更好...... ionic serve --lab
查看iOS和Android的自动刷新并排视图。
831
2018-04-17 01:21
看看这个 要旨。我在这里复制它以供参考,但要点已经定期更新。
Node.JS静态文件Web服务器。将它放在您的路径中以启动任何目录中的服务器,获取可选的端口参数。
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);
fs.exists(filename, function(exists) {
if(!exists) {
response.writeHead(404, {"Content-Type": "text/plain"});
response.write("404 Not Found\n");
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 at\n => http://localhost:" + port + "/\nCTRL + C to shutdown");
更新
要点确实处理css和js文件。我自己用过它。在“二进制”模式下使用读/写不是问题。这只意味着文件不会被文件库解释为文本,并且与响应中返回的内容类型无关。
您的代码的问题是您总是返回内容类型的“text / plain”。上面的代码不会返回任何内容类型,但如果您只是将它用于HTML,CSS和JS,浏览器可以推断出这些内容就好了。 没有内容类型比错误的更好。
通常,内容类型是Web服务器的配置。如果这不能解决,我很抱歉 你的 问题,但它作为一个简单的开发服务器对我有用,并认为它可能会帮助其他人。如果确实需要在响应中使用正确的内容类型,则需要将其明确定义为joeytwiddle,或者使用具有合理默认值的Connect之类的库。关于这一点的好处是它简单且独立(没有依赖)。
但我确实感觉到了你的问题。所以这是组合的解决方案。
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"
};
fs.exists(filename, function(exists) {
if(!exists) {
response.writeHead(404, {"Content-Type": "text/plain"});
response.write("404 Not Found\n");
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 at\n => http://localhost:" + port + "/\nCTRL + C to shutdown");
147
2017-11-29 21:46
你不需要快递。你不需要连接。 Node.js确实是http NATIVELY。您需要做的就是根据请求返回一个文件:
var http = require('http')
var url = require('url')
var fs = require('fs')
http.createServer(function (request, response) {
var requestUrl = url.parse(request.url)
response.writeHead(200)
fs.createReadStream(requestUrl.pathname).pipe(response) // do NOT use fs's sync methods ANYWHERE on production (e.g readFileSync)
}).listen(9615)
一个更完整的示例,可确保请求无法访问基目录下的文件,并进行正确的错误处理:
var http = require('http')
var url = require('url')
var fs = require('fs')
var path = require('path')
var baseDirectory = __dirname // or whatever base directory you want
var port = 9615
http.createServer(function (request, response) {
try {
var requestUrl = url.parse(request.url)
// need to use path.normalize so people can't access directories underneath baseDirectory
var fsPath = baseDirectory+path.normalize(requestUrl.pathname)
var fileStream = fs.createReadStream(fsPath)
fileStream.pipe(response)
fileStream.on('open', function() {
response.writeHead(200)
})
fileStream.on('error',function(e) {
response.writeHead(404) // assume the file doesn't exist
response.end()
})
} catch(e) {
response.writeHead(500)
response.end() // end the response so browsers don't hang
console.log(e.stack)
}
}).listen(port)
console.log("listening on port "+port)
75
2017-10-14 06:59
我认为你现在缺少的那部分是你发送的:
Content-Type: text/plain
如果您希望Web浏览器呈现HTML,则应将其更改为:
Content-Type: text/html
64
2018-05-21 21:11
Step1(在命令提示符内部[我希望你cd到你的文件夹]): 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(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
43
2018-02-24 14:44
快捷方式:
var express = require('express');
var app = express();
app.use('/', express.static(__dirname + '/../public')); // ← adjust
app.listen(3000, function() { console.log('listening'); });
你的方式:
var http = require('http');
var fs = require('fs');
http.createServer(function (req, res) {
console.dir(req.url);
// will get you '/' or 'index.html' or 'css/styles.css' ...
// • you need to isolate extension
// • have a small mimetype lookup array/object
// • only there and then reading the file
// • delivering it after setting the right content type
res.writeHead(200, {'Content-Type': 'text/html'});
res.end('ok');
}).listen(3001);
27
2018-02-07 08:28
我认为从字典中查找内容类型更简洁,而不是处理switch语句:
var contentTypesByExtension = {
'html': "text/html",
'js': "text/javascript"
};
...
var contentType = contentTypesByExtension[fileExtension] || 'text/plain';
19
2017-11-24 21:08
这基本上是连接版本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作为默认选项。
14
2018-06-20 17:40
你不需要使用任何NPM模块来运行一个简单的服务器,有一个非常小的库叫做“NPM免费服务器“对于节点:
50行代码,如果您请求文件或文件夹,则输出,如果工作失败,则为红色或绿色。小于1KB(缩小)。
11
2017-11-09 16:10
如果您在PC上安装了节点,可能您有NPM,如果您不需要NodeJS,可以使用 服务 包装:
1 - 在PC上安装软件包:
npm install -g serve
2 - 提供静态文件夹:
serve <path>
d:> serve d:\StaticSite
它将显示您的静态文件夹所在的端口,只需导航到主机,如:
http://localhost:3000
9
2018-02-23 17:57