Using node.js as a simple web server
我想运行一个非常简单的HTTP服务器。 对
使用下面的代码,我可以阅读
1 2 3 4 5 6 7 8 | 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,图像)文件写一个
如何使用一些图像,CSS和JavaScript提供单个HTML页面?
您可以将Connect和ServeStatic与Node.js一起使用:
使用NPM安装connect和serve-static
1 | $ npm install connect serve-static |
使用此内容创建server.js文件:
1 2 3 4 5 | var connect = require('connect'); var serveStatic = require('serve-static'); connect().use(serveStatic(__dirname)).listen(8080, function(){ console.log('Server running on 8080...'); }); |
使用Node.js运行
1 | $ node server.js |
您现在可以转到
最简单的Node.js服务器就是:
1 | $ npm install http-server -g |
现在,您可以通过以下命令运行服务器:
1 2 3 | $ cd MyApp $ http-server |
如果您使用的是NPM 5.2.0或更高版本,则可以使用
1 | $ npx http-server |
或者,您可以尝试这样做,这将打开您的Web浏览器并启用CORS请求:
1 | $ http-server -o --cors |
有关更多选项,请查看GitHub上
1 | $ http-server --help |
很多其他不错的功能和对NodeJitsu的脑死亡简单部署。
功能分叉
当然,您可以使用自己的fork轻松实现功能。你可能会发现它已经在这个项目现有的800多个分支中完成:
- https://github.com/nodeapps/http-server/network
轻型服务器:自动刷新替代方案
1 2 | $ npm install -g light-server $ light-server |
在Windows资源管理器中添加到目录上下文菜单
1 2 | reg.exe add HKCR\Directory\shell\LightServer\command /ve /t REG_EXPAND_SZ /f /d""C: odejs\light-server.cmd" "-o" "-s" "%V"" |
简单的JSON REST服务器
如果您需要为原型项目创建一个简单的REST服务器,那么json-server可能就是您正在寻找的。
自动刷新编辑器
大多数网页编辑器和IDE工具现在都包含一个Web服务器,它将监视您的源文件并在更改时自动刷新您的网页。
我使用Live Server与Visual Studio代码。
开源文本编辑器Brackets还包括一个NodeJS静态Web服务器。只需在Brackets中打开任何HTML文件,按"实时预览"即可启动静态服务器并在页面上打开浏览器。每当您编辑和保存HTML文件时,浏览器都会自动刷新。这在测试自适应网站时尤其有用。在多个浏览器/窗口大小/设备上打开HTML页面。保存您的HTML页面,并立即查看您的自适应内容是否正常工作,因为它们都会自动刷新。
PhoneGap开发人员
如果您正在编写混合移动应用程序,您可能有兴趣知道PhoneGap团队使用他们的新PhoneGap应用程序采用了这种自动刷新概念。这是一个通用的移动应用程序,可以在开发期间从服务器加载HTML5文件。这是一个非常流畅的技巧,因为现在你可以跳过混合移动应用程序的开发周期中的慢速编译/部署步骤,如果你要更改JS / CSS / HTML文件 - 这是你大部分时间都在做的事情。它们还提供检测文件更改的静态NodeJS Web服务器(运行
PhoneGap + Sencha Touch开发者
我现在已经为Sencha Touch和jQuery Mobile开发人员广泛调整了PhoneGap静态服务器和PhoneGap开发者应用程序。在Sencha Touch Live上查看。支持--qr QR码和--localtunnel,它将您的静态服务器从您的台式计算机代理到防火墙外的URL!吨的用途。混合移动设备的大规模加速。
Cordova + Ionic框架开发人员
本地服务器和自动刷新功能将附加到
看看这个要点。我在这里复制它以供参考,但要点已经定期更新。
Node.JS static file web server. Put it in your path to fire up servers in any directory, takes an optional port argument.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 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 "); 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 +" "); response.end(); return; } response.writeHead(200); response.write(file,"binary"); response.end(); }); }); }).listen(parseInt(port, 10)); console.log("Static file server running at => http://localhost:" + port +"/ CTRL + C to shutdown"); |
更新
gist确实处理css和js文件。我自己用过它。在"二进制"模式下使用读/写不是问题。这只意味着文件不会被文件库解释为文本,并且与响应中返回的内容类型无关。
您的代码的问题是您总是返回内容类型的"text / plain"。上面的代码不会返回任何内容类型,但是如果您只是将它用于HTML,CSS和JS,那么浏览器可以推断出那些就好了。没有内容类型比错误的更好。
通常,内容类型是Web服务器的配置。所以我很抱歉,如果这不能解决您的问题,但它对我来说是一个简单的开发服务器,并认为它可能会帮助其他人。如果确实需要在响应中使用正确的内容类型,则需要将它们显式定义为joeytwiddle,或使用具有合理默认值的Connect之类的库。关于这一点的好处是它简单且独立(没有依赖)。
但我确实感觉到了你的问题。所以这是组合的解决方案。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | 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 "); 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 +" "); 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 => http://localhost:" + port +"/ CTRL + C to shutdown"); |
你不需要快递。你不需要连接。 Node.js确实是http NATIVELY。您需要做的就是根据请求返回一个文件:
1 2 3 4 5 6 7 8 9 | 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) |
一个更完整的示例,可确保请求无法访问基目录下的文件,并进行正确的错误处理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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) |
我认为你现在缺少的那部分是你发送的:
1 | Content-Type: text/plain |
如果您希望Web浏览器呈现HTML,则应将其更改为:
1 | Content-Type: text/html |
Step1(在命令提示符内部[我希望你cd到你的文件夹]):
第2步:创建文件server.js
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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:
如果您只想要主机简单的HTTP服务器,现在有更简单的方法。
并打开我们的目录并输入
https://www.npmjs.org/package/http-server
快捷方式:
1 2 3 4 | var express = require('express'); var app = express(); app.use('/', express.static(__dirname + '/../public')); // ← adjust app.listen(3000, function() { console.log('listening'); }); |
你的方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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); |
我认为从字典中查找内容类型更简洁,而不是处理switch语句:
1 2 3 4 5 6 7 8 | var contentTypesByExtension = { 'html':"text/html", 'js': "text/javascript" }; ... var contentType = contentTypesByExtension[fileExtension] || 'text/plain'; |
这基本上是连接版本3的已接受答案的更新版本:
1 2 3 4 5 6 7 | var connect = require('connect'); var serveStatic = require('serve-static'); var app = connect(); app.use(serveStatic(__dirname, {'index': ['index.html']})); app.listen(3000); |
我还添加了一个默认选项,以便将index.html作为默认选项。
您不需要使用任何NPM模块来运行简单的服务器,对于Node,有一个非常小的库叫做"NPM Free Server":
- GitHub上的NPM免费服务器
50行代码,如果您请求文件或文件夹,则输出,如果工作失败,则为红色或绿色。小于1KB(缩小)。
如果您的PC上安装了节点,可能您有NPM,如果您不需要NodeJS,可以使用serve包:
1 - 在PC上安装软件包:
1 | npm install -g serve |
2 - 提供静态文件夹:
1 2 | serve <path> d:> serve d:\StaticSite |
它将显示您的静态文件夹所在的端口,只需导航到主机,如:
1 | http://localhost:3000 |
我在npm上找到了一个有趣的库,可能对你有用。它被称为mime(
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | var mime = require("mime"),http = require("http"),fs = require("fs"); http.createServer(function (req, resp) { path = unescape(__dirname + req.url) var code = 200 if(fs.existsSync(path)) { if(fs.lstatSync(path).isDirectory()) { if(fs.existsSync(path+"index.html")) { path +="index.html" } else { code = 403 resp.writeHead(code, {"Content-Type":"text/plain"}); resp.end(code+""+http.STATUS_CODES[code]+""+req.url); } } resp.writeHead(code, {"Content-Type": mime.lookup(path)}) fs.readFile(path, function (e, r) { resp.end(r); }) } else { code = 404 resp.writeHead(code, {"Content-Type":"text/plain"}); resp.end(code+""+http.STATUS_CODES[code]+""+req.url); } console.log("GET"+code+""+http.STATUS_CODES[code]+""+req.url) }).listen(9000,"localhost"); console.log("Listening at http://localhost:9000") |
这将提供任何常规文本或图像文件(.html,.css,.js,.pdf,.jpg,.png,.m4a和.mp3是我测试过的扩展,但理论上它应该适用于所有内容)
开发者说明
这是我用它得到的输出示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 | Listening at http://localhost:9000 GET 200 OK /cloud GET 404 Not Found /cloud/favicon.ico GET 200 OK /cloud/icon.png GET 200 OK / GET 200 OK /501.png GET 200 OK /cloud/manifest.json GET 200 OK /config.log GET 200 OK /export1.png GET 200 OK /Chrome3DGlasses.pdf GET 200 OK /cloud GET 200 OK /-1 GET 200 OK /Delta-Vs_for_inner_Solar_System.svg |
注意路径构造中的
我这样做的方法是首先通过全局安装节点静态服务器
1 | npm install node-static -g |
然后导航到包含html文件的目录,并使用
转到浏览器并键入
编辑:
Node.js示例应用程序节点聊天具有您想要的功能。
在它的README.text文件中
3.步骤就是你要找的。
step1
- create a server that responds with hello world on port 8002
step2
- create an index.html and serve it
step3
- introduce util.js
- change the logic so that any static file is served
- show 404 in case no file is found
step4
- add jquery-1.4.2.js
- add client.js
- change index.html to prompt user for nickname
这是server.js
这是util.js
基本上复制接受的答案,但避免创建一个js文件。
1 2 | $ node > var connect = require('connect'); connect().use(static('.')).listen(8000); |
发现它非常方便。
更新
截至最新版Express,serve-static已成为一个独立的中间件。用它来服务:
1 | require('http').createServer(require('serve-static')('.')).listen(3000) |
首先安装
1 2 3 4 5 6 7 8 9 | 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/html'}); // change the to 'text/plain' to 'text/html' it will work as your index page res.end(index); }).listen(9615); |
我想你在哪里寻找这个。在你的index.html中,只需用普通的html代码填充它 - 无论你想在它上面呈现什么,比如:
1 2 3 | <html> Hello world </html> |
我不确定这是否正是您想要的,但是,您可以尝试更改:
1 | {'Content-Type': 'text/plain'} |
对此:
1 | {'Content-Type': 'text/html'} |
这将使浏览器客户端将文件显示为html而不是纯文本。
我使用下面的代码启动一个简单的Web服务器,如果Url中没有提到文件,它会呈现默认的html文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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内容。
同意声明"没有内容类型比错误的更好"
稍微详细的表达4.x版本,但它提供了最少行数的目录列表,压缩,缓存和请求记录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var express = require('express'); var compress = require('compression'); var directory = require('serve-index'); var morgan = require('morgan'); //logging for express var app = express(); var oneDay = 86400000; app.use(compress()); app.use(morgan()); app.use(express.static('filesdir', { maxAge: oneDay })); app.use(directory('filesdir', {'icons': true})) app.listen(process.env.PORT || 8000); console.log("Ready To serve files !") |
疯狂的复杂答案在这里。如果您不打算处理nodeJS文件/数据库,但只是想提供静态html / css / js / images作为您的问题建议,那么只需安装pushstate-server模块或类似的;
这是一个"一个班轮",将创建和发布一个迷你网站。只需将终端中的整个块粘贴到相应的目录中即可。
1 2 3 4 5 6 7 8 9 | mkdir mysite; \ cd mysite; \ npm install pushstate-server --save; \ mkdir app; \ touch app/index.html; \ echo 'Hello World' > app/index.html; \ touch server.js; \ echo"var server = require('pushstate-server');server.start({ port: 3000, directory: './app' });"> server.js; \ node server.js |
打开浏览器并转到http:// localhost:3000。完成。
服务器将使用
来自w3schools
创建一个节点服务器以提供所请求的任何文件非常容易,而且您不需要为它安装任何软件包
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var http = require('http'); var url = require('url'); var fs = require('fs'); http.createServer(function (req, res) { var q = url.parse(req.url, true); var filename ="." + q.pathname; fs.readFile(filename, function(err, data) { if (err) { res.writeHead(404, {'Content-Type': 'text/html'}); return res.end("404 Not Found"); } res.writeHead(200, {'Content-Type': 'text/html'}); res.write(data); return res.end(); }); }).listen(8080); |
HTTP://本地主机:8080 / file.html
将从磁盘提供file.html
你可以在shell中输入那些
1 | npx serve |
回复:https://github.com/zeit/serve。
上面的大多数答案非常清楚地描述了如何提供内容。我所看到的另外一个是目录列表,以便可以浏览目录的其他内容。这是我的进一步读者的解决方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 'use strict'; var finalhandler = require('finalhandler'); var http = require('http'); var serveIndex = require('serve-index'); var serveStatic = require('serve-static'); var appRootDir = require('app-root-dir').get(); var log = require(appRootDir + '/log/bunyan.js'); var PORT = process.env.port || 8097; // Serve directory indexes for reports folder (with icons) var index = serveIndex('reports/', {'icons': true}); // Serve up files under the folder var serve = serveStatic('reports/'); // Create server var server = http.createServer(function onRequest(req, res){ var done = finalhandler(req, res); serve(req, res, function onNext(err) { if (err) return done(err); index(req, res, done); }) }); server.listen(PORT, log.info('Server listening on: ', PORT)); |
对于简单的
如果您在更改文件时需要
1 | npm install lite-server -g |
导航你的目录并做
1 | lite-server |
它将通过实时重新加载为您打开浏览器。
1 2 3 4 5 6 7 8 9 10 | var http = require('http'); var fs = require('fs'); var index = fs.readFileSync('index.html'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'html'}); res.end(index); }).listen(9615); //Just Change The CONTENT TYPE to 'html' |
我遇到的更简单的版本如下。出于教育目的,最好,因为它不使用任何抽象库。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | var http = require('http'), url = require('url'), path = require('path'), fs = require('fs'); var mimeTypes = { "html":"text/html", "mp3":"audio/mpeg", "mp4":"video/mp4", "jpeg":"image/jpeg", "jpg":"image/jpeg", "png":"image/png", "js":"text/javascript", "css":"text/css"}; http.createServer(function(req, res) { var uri = url.parse(req.url).pathname; var filename = path.join(process.cwd(), uri); fs.exists(filename, function(exists) { if(!exists) { console.log("not exists:" + filename); res.writeHead(200, {'Content-Type': 'text/plain'}); res.write('404 Not Found '); res.end(); return; } var mimeType = mimeTypes[path.extname(filename).split(".")[1]]; res.writeHead(200, {'Content-Type':mimeType}); var fileStream = fs.createReadStream(filename); fileStream.pipe(res); }); //end path.exists }).listen(1337); |
现在转到浏览器并打开以下内容:
1 | http://127.0.0.1/image.jpg |
这里
希望这有助于某人:)
这是我用来快速查看网页的最快解决方案之一
1 | sudo npm install ripple-emulator -g |
从那时起,只需输入您的html文件的目录并运行即可
1 | ripple emulate |
然后将设备更改为Nexus 7格局。
local-web-server绝对值得一看!以下是自述文章的摘录:
本地Web服务器
精简的模块化Web服务器,用于快速的全栈开发。
- 支持HTTP,HTTPS和HTTP2。
- 小而且100%个性化。仅加载和使用项目所需的行为。
- 附加自定义视图以个性化可视化活动的方式。
- 编程和命令行界面。
使用此工具:
- 构建任何类型的前端Web应用程序(静态,动态,单页应用程序,Progessive Web App,React等)。
- 原型化后端服务(REST API,微服务,websocket,服务器发送事件服务等)。
- 监控活动,分析性能,试验缓存策略等
本地网络服务器是捆绑了有用中间件"初学者包"的lws发行版。
概要
该软件包安装
静态网站
不带任何参数运行
1 2 | $ ws Listening on http://mbp.local:8000, http://127.0.0.1:8000, http://192.168.0.100:8000 |
静态文件教程。
此剪辑演示了静态托管以及几种日志输出格式 -
单页应用程序
提供单页应用程序(具有客户端路由的应用程序,例如React或Angular应用程序)与指定单个页面的名称一样简单:
1 | $ ws --spa index.html |
对于静态站点,对典型SPA路径(例如
如果请求静态文件(例如
SPA教程。
URL重写和代理请求
另一个常见用例是将某些请求转发到远程服务器。
以下命令代理博客从
1 | $ ws --rewrite '/posts/(.*) -> https://jsonplaceholder.typicode.com/posts/$1' |
重写教程。
此剪辑演示了上述使用
HTTPS和HTTP2
对于HTTPS或HTTP2,分别传递
1 2 | $ lws --http2 Listening at https://mba4.local:8000, https://127.0.0.1:8000, https://192.168.0.200:8000 |
我也可以推荐SugoiJS,它很容易设置,并提供快速开始编写和具有强大功能的选项。
看看这里开始:http://demo.sugoijs.com/
,文档:https://wiki.sugoijs.com/
它有请求处理装饰器,请求策略和授权策略装饰器。
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import {Controller,Response,HttpGet,RequestParam} from"@sugoi/server"; ? @Controller('/dashboard') export class CoreController{ constructor(){} ? @HttpGet("/:role") test(@RequestParam('role') role:string, @RequestHeader("role") headerRole:string){ if(role === headerRole ) return"authorized"; else{ throw new Error("unauthorized") } } } |
今天有大量的图书馆,很容易。这里的答案是功能性的。如果您想要更快更简单的另一个版本
当然先安装node.js.后来:
1 2 3 4 | > # module with zero dependencies > npm install -g @kawix/core@latest > # change /path/to/static with your folder or empty for current > kwcore"https://raw.githubusercontent.com/voxsoftware/kawix-core/master/example/npmrequire/express-static.js" /path/to/static |
这里的内容为"https://raw.githubusercontent.com/voxsoftware/kawix-core/master/example/npmrequire/express-static.js"(你不需要下载它,我发布了解如何工作背后)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // you can use like this: // kwcore"https://raw.githubusercontent.com/voxsoftware/kawix-core/master/example/npmrequire/express.js" /path/to/static // kwcore"https://raw.githubusercontent.com/voxsoftware/kawix-core/master/example/npmrequire/express.js" // this will download the npm module and make a local cache import express from 'npm://express@^4.16.4' import Path from 'path' var folder= process.argv[2] ||"." folder= Path.resolve(process.cwd(), folder) console.log("Using folder as public:" + folder) var app = express() app.use(express.static(folder)) app.listen(8181) console.log("Listening on 8181") |