项目准备

Web 服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等 Web 客户端提供文档,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。目前最主流的三个 Web 服务器是 Apache Nginx IIS,接下来主要是总结一下怎么使用node创建一个自己的静态web服务器,在开始前,需要先准备一个前端项目:

 

http模块

在前面的随笔中有简单的总结过http模块和fs模块:使用http创建简单的服务时,能够获取用户在地址栏中输入的请求,并且每次都会额外的多一个favicon.ico请求。

而现在,要实现静态web服务,就是要根据用户的请求动态加载相关页面资源并返回,首先要做的便是获取用户请求:

var http=require('http');
var fs=require('fs');
http.createServer(function(req,res){
var pathname=req.url;
if(pathname=='/'){
pathname='/index.html';
}
if(pathname!='/favicon.ico'){
fs.readFile('static/'+pathname,function(err,data){
if(err){
console.log('404');
}else{
res.writeHead(200,{"Content-Type":"text/html;charset='utf-8'"});
res.write(data);
res.end();
}
})
}
}).listen(8001);

在上面的代码中,首先使用http创建了一个服务,然后在第一个if语句中,添加了一个默认请求(默认加载页面),在第二个if主要是先过滤每次请求中的favicon.ico请求,然后根据不同的请求,加载static页面下的不同页面。

当用户请求http://localhost:8001/时,先执行了第一个if,请求变为了http://localhost:8001/index.html,进入第二个if,去static文件夹中找到index.html并返回,但是,此时和期望的结果是不一样的,这是因为,在index.html中,有很多其他类型的请求

当请求了index.html后,就会自动触发这些请求,根据上面这些请求分别是css和js,需要添加不同的头文件,但是在上面的例子中,全部都是添加统一的头文件,自然显示就会有问题。

文件类型

从上面的例子看,根据不同的文件类型来添加不同的头文件,主要是需要获取请求的后缀名,然后根据后缀名来添加头文件。

要获取后缀名,需要使用到path模块

  

  

获取到后缀名以后,就可以在01.js的基础上面,动态添加头文件了,首先新建一个getmime.js文件,用于根据后缀名返回头文件类型,然后在01.js的基础上新建02.js

var http=require('http');
var fs=require('fs');
var path=require('path');
var mimeModel=require('./model/getmime.js');
http.createServer(function(req,res){
var pathname=req.url;
if(pathname=='/'){
pathname='/index.html';
}
var extname=path.extname(pathname);
if(pathname!='/favicon.ico'){
fs.readFile('static/'+pathname,function(err,data){
if(err){
console.log('404');
fs.readFile('static/404.html',function(error,data404){
if(error){
console.log(error);
}
res.writeHead(404,{"Content-Type":"text/html;charset='utf-8'"});
res.write(data404);
res.end(); /*结束响应*/
})
}else{
var mime=mimeModel.getMime(extname); /*获取文件类型*/
res.writeHead(200,{"Content-Type":""+mime+";charset='utf-8'"});
res.write(data);
res.end(); /*结束响应*/
}
})
}
}).listen(8001);

正确获取请求文件

现在,看上去好像已经基本实现了预期的效果,但是,下面这种请求就会出错了:

按照正常逻辑,上面的地址还是请求的index.html,只是后面多加了参数而已,但是在上面02.js里面确实这样的结果

   

也就是说,在有参数的时候,上面的方法时行不通的,所以,我们还需要借助url模块来正确解析出请求地址中的文件(03.js)

var http=require('http');
var fs=require('fs');
var path=require('path');
var url=require('url');
var mimeModel=require('./model/getmime.js');
http.createServer(function(req,res){
var pathname=url.parse(req.url).pathname;
console.log(pathname)
if(pathname=='/'){
pathname='/index.html';
}
var extname=path.extname(pathname);
console.log(extname);
if(pathname!='/favicon.ico'){
fs.readFile('static/'+pathname,function(err,data){
if(err){
console.log('404');
fs.readFile('static/404.html',function(error,data404){
if(error){
console.log(error);
}
res.writeHead(404,{"Content-Type":"text/html;charset='utf-8'"});
res.write(data404);
res.end(); /*结束响应*/
})
}else{
var mime=mimeModel.getMime(extname); /*获取文件类型*/
res.writeHead(200,{"Content-Type":""+mime+";charset='utf-8'"});
res.write(data);
res.end(); /*结束响应*/
}
})
}
}).listen(8001);

各种文件类型

在02.js中,为了实现效果,根据不同的请求添加不同的头文件,只是列举几种常见的文件类型,但在实际项目中的文件类型,远不止这些,所以这里提供了一份更完整的文件类型所对应的头文件:

mime.json

然后再新建文件getmimefromfile.js,添加一个方法,传入文件后缀名后,返回对应的头文件:

最后,在03.js的基础上面引入该文件,完善代码

var http=require('http');
var fs=require('fs');
var path=require('path');
var url=require('url');
var mimeModel=require('./model/getmimefromfile.js');
http.createServer(function(req,res){
var pathname=url.parse(req.url).pathname;
if(pathname=='/'){
pathname='/index.html'; /*默认加载的首页*/
}
var extname=path.extname(pathname);
if(pathname!='/favicon.ico'){
fs.readFile('static/'+pathname,function(err,data){
if(err){
fs.readFile('static/404.html',function(error,data404){
if(error){
console.log(error);
}
res.writeHead(404,{"Content-Type":"text/html;charset='utf-8'"});
res.write(data404);
res.end();
})
}else{
var mime=mimeModel.getMime(fs,extname); /*获取文件类型*/
res.writeHead(200,{"Content-Type":""+mime+";charset='utf-8'"});
res.write(data);
res.end();
}
})
}
}).listen(8001);

代码下载:点这里 提取码(2f71)

文章整理自it营相关教程

nodejs静态web服务的更多相关文章

  1. nodejs搭建web服务教程

    nodejs搭建web服务教程 先安装nodejs 然后 命令node js文件 即可开启服务了 输出如下 Magic happens on port 9011 你查看端口可以看到tcp 0 0 :: ...

  2. koa 基础(十二)koa-static 静态资源中间件 静态web服务

    1.目录 2.app.js /** * koa-static 静态资源中间件 静态web服务 * 1.npm install --save koa-static * 2.const static = ...

  3. nodejs 静态资源服务与接口代理跨域

    首先需要 npm install express 和 npm install request 代码如下: const express = require('express'); const path ...

  4. Nginx作为静态WEB服务

    1.静态资源类型 Nginx作为静态资源Web服务器部署配置, 传输非常的高效, 常常用于静态资源处理, 请求, 动静分离 非服务器动态运行生成的文件属于静态资源 类型 种类 浏览器端渲染 HTML. ...

  5. Nodejs 创建web服务

    // 加载http服务包 var http = require("http"); // 创建服务 var server = http.createServer(requestLis ...

  6. 018-Go将磁盘目录实现简单的静态Web服务

    package main import( "net/http" ) func main(){ http.Handle("/", http.FileServer( ...

  7. Nginx 在Windows下搭建静态Web服务

    简介 nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP ...

  8. Nginx基础 - 配置静态web服务

    1.静态参数配置1)文件读取高效sendfile Syntax: sendfile on | off; Default: sendfile off; Context: http, server, lo ...

  9. redhat enterprixe 5.0 web 服务配置与管理

    一.Web服务及工作原理 Web服务的实现采用客户/服务器模型.客户机运行Web客户程序(浏览器),作用是解释和显示Web页面,相应用户的输入请求,并且通过http协议将用户请求传递给Web服务器.W ...

随机推荐

  1. Maven可以使用mvn package指令对项目进行打包,如果使用Java -jar xxx.java

    Maven可以使用mvn package指令对项目进行打包,如果使用Java -jar xxx.jar执行运行jar文件,会出现"no main manifest attribute, in ...

  2. CnPack组件包的安装与使用

    如果你用过Eclipse.NotePad++等等工具,再试试用刚装好Delphi写代码会很痛苦,你是否觉得Delphi的代码编辑器很不友好? 那就去了解一下CnPack吧,给你的Delphi装上它绝对 ...

  3. AVL Tree Insertion

    Overview AVL tree is a special binary search tree, by definition, any node, its left tree height and ...

  4. 完美解决win10家庭版本系统无法远程连接问题

    版权声明:本文转载.原文: https://blog.csdn.net/rainmaple20186/article/details/80913191 近期接入同一局域网的服务器,发现在连接的时候,报 ...

  5. Installshield创建快捷方式不能正常运行的几种原因

    Installshield软件提供创建快捷方式的功能,但是经常有朋友发现创建了以后快捷方式不能运行,在此列一下几种常见原因供各位朋友参考: 1. 没有选择相应的working directory,这种 ...

  6. Sublime 黑科技之——lorem快速输入

    需要一段文字填充某块演示的空间,但不管写什么文字都觉得不合适,那么这个黑科技你值的拥有. 在Sublime Text中,输入lorem,再按Tab键,即可快速输入一段无意义的占位字符: Lorem i ...

  7. Ubuntu下部分Java软件字体渲染问题解决方法

    On ubuntu or in general Linux OS, fonts in some Java software(like Geogebra, Arduino) looks terriabl ...

  8. PAT乙级考前总结(三)

    特殊题型 1027 打印沙漏 (20 分) 题略,感觉有点像大学里考试的题.找规律即可. #include <stdio.h>#include <iostream>using ...

  9. ServletContext、ServletRequest和HttpSession的生命周期

    学习web的Listener监听器的时,监听域对象创建的监听器.通过监听器重新分析着三个对象的生命周期,清晰明了. 首先域对象的监听器有三个ServletContextListene.ServletR ...

  10. Eclipse导入已有的项目后项目报错的解决办法

    第一种:jsp报错 选择windows-->preference-->列表找到Validation-->点击Disable All ->> Apply ->> ...