使用Node.js搭建Web服务器
1、 Node.js 创建的第一个应用
1、引入http模块
var http = require("http");
2、 创建服务器
接下来我们使用 http.createServer() 方法创建服务器,并使用 listen 方法绑定 8888 端口。函数通过 request, response 参数来接收和响应数据。
//1.引入 http 模块 var http=require('http'); //2.用 http 模块创建服务 http.createServer(function(req,res){ // 发送 HTTP 头部 // HTTP 状态值: 200 : OK //设置 HTTP 头部,状态码是 200,文件类型是 html,字符集是 utf-8 res.writeHead(200,{"Content-Type":"text/html;charset='utf-8'"}); res.write('你好 nodejs'); res.write('我是第一个 nodejs 程序'); res.end(); /*结束响应*/ }).listen(8001);
2、 WEB 服务器介绍
Web 服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等 Web 客户端提供文档, 也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。目前最主流的三个 Web 服务器是 Apache 、 Nginx 、IIS。
3、 Nodejs 封装一个 WEB 服务器
启动
node start
功能
* 能显示以 `.html/.htm` 结尾的 Web 页面
* 能直接打开以 `.js/.css/.json/.text` 结尾的文件内容
* 显示图片资源
* 自动下载以 `.apk/.docx/.zip` 结尾的文件
* 形如 `http://xxx.com/a/b/` , 则查找b目录下是否有 `index.html`,如果有就显示,如果没有就列出该目录下的所有文件及文件夹,并可以进一步访问。
* 形如 `http://xxx.com/a/b`, 则作301重定向到 `http://xxx.com/a/b/` , 这样可以解决内部资源引用错位的问题。
HttpServer.js
module.exports = (function () { "use strict"; console.time('[HttpServer][Start]'); //http协议模块 var http = require('http'); //url解析模块 var url = require('url'); //文件系统模块 var fs = require("fs"); //路径解析模块 var path = require("path"); return { //启动服务 start: function () { var port = this.config.port; var ip = this.config.ip; //创建一个服务 var httpServer = http.createServer(this.processRequest.bind(this)); //在指定的端口监听服务 httpServer.listen(port, function () { console.log("[HttpServer][Start]", "runing at http://" + ip + ":" + port + "/"); console.timeEnd("[HttpServer][Start]"); }); httpServer.on("error", function (error) { console.error(error); }); }, /** * 请求处理 * @param request * @param response */ processRequest: function (request, response) { var hasExt = true; var requestUrl = request.url; var pathName = url.parse(requestUrl).pathname; //对请求的路径进行解码,防止中文乱码 pathName = decodeURI(pathName); //如果路径中没有扩展名 if ((pathName) === '') { //如果不是以/结尾的,加/并作301重定向 if (pathName.charAt(pathName.length - 1) != "/") { pathName += "/"; var redirect = "http://" + request.headers.host + pathName; response.writeHead(301, { location: redirect }); response.end(); return; //fix bug: 执行301重定向后应终止后续流程,以防 "write after end" 异常 } //添加默认的访问页面,但这个页面不一定存在,后面会处理 pathName += "index.html"; hasExt = false; //标记默认页面是程序自动添加的 } //获取资源文件的相对路径 var filePath = path.join("http/webroot", pathName); //获取对应文件的文档类型 var contentType = this.getContentType(filePath); //如果文件名存在 fs.exists(filePath, function (exists) { if (exists) { response.writeHead(200, {"content-type": contentType}); var stream = fs.createReadStream(filePath, {flags: "r", encoding: null}); stream.on("error", function () { response.writeHead(500, {"content-type": "text/html"}); response.end("<h1>500 Server Error</h1>"); }); //返回文件内容 stream.pipe(response); } else { //文件名不存在的情况 if (hasExt) { //如果这个文件不是程序自动添加的,直接返回404 response.writeHead(404, {"content-type": "text/html"}); response.end("<h1>404 Not Found</h1>"); } else { //如果文件是程序自动添加的且不存在,则表示用户希望访问的是该目录下的文件列表 var html = "<head><meta charset='utf-8'></head>"; try { //用户访问目录 var filedir = filePath.substring(0, filePath.lastIndexOf('\\')); //获取用户访问路径下的文件列表 var files = fs.readdirSync(filedir); //将访问路径下的所以文件一一列举出来,并添加超链接,以便用户进一步访问 for (var i in files) { var filename = files[i]; html += "<div><a href='" + filename + "'>" + filename + "</a></div>"; } } catch (e) { html += "<h1>您访问的目录不存在</h1>" } response.writeHead(200, {"content-type": "text/html"}); response.end(html); } } }); }, /** * 获取文档的内容类型 * @param filePath * @returns {*} */ getContentType: function (filePath) { var contentType = this.config.mime; var ext = path.extname(filePath).substr(1); if (contentType.hasOwnProperty(ext)) { return contentType[ext]; } else { return contentType.default; } }, ///配置信息 config: { port: 8888, ip: '127.0.0.1', mime: { html: "text/html", js: "text/javascript", css: "text/css", gif: "image/gif", jpg: "image/jpeg", png: "image/png", ico: "image/icon", txt: "text/plain", json: "application/json", default: "application/octet-stream" } } } })();
start.js
var http = require('./http/HttpServer'); http.start();
源代码
点击下载
到此这篇关于使用Node.js搭建Web服务器的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持猪先飞。
原文出处:https://www.cnblogs.com/chenyablog/p/9849719.html
相关文章
Springboot如何实现Web系统License授权认证
这篇文章主要介绍了Springboot如何实现Web系统License授权认证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-05-28C#使用Http Post方式传递Json数据字符串调用Web Service
这篇文章主要为大家详细介绍了C#使用Http Post方式传递Json数据字符串调用Web Service,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25- 简单的php获取linux服务器状态的代码,不多说-直接上函数:复制代码 代码如下:function get_used_status(){ $fp = popen('top -b -n 2 | grep -E "^(Cpu|Mem|Tasks)"',"r");//获取某一时刻系统cpu和内存使用情况 $rs =...2014-05-31
InterlliJ IDEA2020新建java web项目找不到Static Web的解决
这篇文章主要介绍了InterlliJ IDEA2020新建java web项目找不到Static Web的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-09-02- 这次文章要给大家介绍的是node.JS md5加密中文与php结果不一致怎么办,不知道具体解决办法的下面跟小编一起来看看。 因项目需要,需要Node.js与PHP做接口调用,发现nod...2017-07-06
- 这篇文章主要介绍了Springboot+TCP监听服务器搭建过程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-10-28
- 使用require('crypto')调用加密模块。加密模块需要底层系统提供OpenSSL的支持。它提供了一种安全凭证的封装方式,可以用于HTTPS安全网络以及普通HTTP连接。该模块还提供了一套针对OpenSSL的hash(哈希),hmac(密钥哈希),cipher...2014-06-07
- 本文介绍基于nodejs+express+art-template的留言板功能。包含列表界面、添加界面和发送留言功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-21
- 1.什么是异步编程? 异步编程是指由于异步I/O等因素,无法同步获得执行结果时, 在回调函数中进行下一步操作的代码编写风格,常见的如setTimeout函数、ajax请求等等。示例: for (var i = 1; i <= 3; i++) {setTimeout(functi...2015-10-23
- 前一段时间使用NetStat命令查看服务器端口时,发现服务器udp端口开放了好多,最少在1000个以上,当时事情比较多,没有管它,今天终于有点时间,仔细检查了一下,排除了这个问题. ...2016-01-27
详解在IDEA中将Echarts引入web两种方式(使用js文件和maven的依赖导入)
这篇文章主要介绍了在IDEA中将Echarts引入web两种方式(使用js文件和maven的依赖导入),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11- “主机,用户名,密码”得到连接、“数据库,sql,连接”得到结果,最后是结果的处理显示。当然,数据库连接是扩展库为我们完成的,我们能做的仅仅是处理结果而已。...2013-09-29
- 这篇文章主要介绍了jQuery mobile 移动web(6)的相关资料,需要的朋友可以参考下...2015-12-21
安装使用Mongoose配合Node.js操作MongoDB的基础教程
这篇文章主要介绍了安装使用Mongoose来让Node.js操作MongoDB的基础教程,前端js+后端node+js操作MongoDB正是所谓最流行的一种JavaScript全栈开发方案,需要的朋友可以参考下...2016-03-03解决HttpPost+json请求---服务器中文乱码及其他问题
这篇文章主要介绍了解决HttpPost+json请求---服务器中文乱码及其他问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-22- 这篇文章介绍的是一个小技巧来获取node.js项目根目录,这个技巧非常实用。有需要的朋友们可以参考借鉴,下面来一起看看吧。...2016-10-02
- 这篇文章主要为大家详细介绍了node.js从数据库获取数据的具体代码,nodejs可以获取具体某张数据表信息,感兴趣的朋友可以参考一下...2016-05-09
- post请求:复制代码 代码如下: request.post('/api/pet') .end(function(resp,err){ if (resp.body.status===200) { alert('yay got ' + JSON.stringify(res.body)); } else { return nex...2015-03-15
- 这篇文章主要介绍了node.js如何操作MySQL数据库,帮助大家更好的进行web开发,感兴趣的朋友可以了解下...2020-10-29
- 这篇文章主要介绍了node.js和Deno的区别,对deno感兴趣的同学,可以参考下...2021-04-27