如何创建一个基于Node的HTTP服务器
首先创建一个HTTP服务器。
var http = require('http');
function serve(request,response) {
console.log(request.method); //请求的方法
console.log(request.url); //请求里的url,只含有路径名,并不是完整的url
console.log(request.header) //获取请求头
response.statusCode = 200;
//设置响应类型,编码为utf-8。
//服务器返回资源给浏览器时,还应该告诉浏览器这是什么类型的文件,以什么方式解析。不指定的话可能会造成乱码
response.setHeader('Content-Type','text/html;charset=utf-8');
response.setHeader('name','zfpx');
response.write(new Date().toString());
response.end();
}
var server = http.createServer(serve);
server.listen(3000);
如果我们希望读取其他文件的内容,则需要先导入fs模块,该模块是读取文件的模块。
var fs = require('fs');
function serve(request,response) {
var url = request.url;//设置响应类型,编码为utf-8。
//服务器返回资源给浏览器时,还应该告诉浏览器这是什么类型的文件,以什么方式解析
response.setHeader('Content-Type','text/html;charset=utf-8');
//如果我们希望返回的是其他文件的内容,则需要先读取其他文件,这时需要fs模块来读取文件
fs.readFile('index.html',function(err,data) {
response.write(data);
response.end();
})
}
但是这样又有一个问题,就是:在对返回的HTML代码开始解析时,解析过程中如果遇到引用的服务器上的资源(额外的CSS,JS代码,图片等资源),需要再次向服务器发送请求,但是不管是发送什么请求,服务器返回的都是index.html文件。这时,我们就需要对不同的请求资源做一个判断,让其返回不同类型的资源。
function serve(request,response) {
var url = request.url;
if (url == '/') {
//设置响应类型,编码为utf-8。
//服务器返回资源给浏览器时,还应该告诉浏览器这是什么类型的文件,以什么方式解析
response.setHeader('Content-Type','text/html;charset=utf-8');
//如果我们希望返回的是其他文件的内容,则需要先读取其他文件,这时需要fs模块来读取文件
fs.readFile('index.html',function(err,data) {
response.write(data);
response.end();
})
}else if (url == '/style.css') {
response.setHeader('Content-Type','text/css;charset=utf-8');
//如果我们希望返回的是其他文件的内容,则需要先读取其他文件,这时需要fs模块来读取文件
fs.readFile('style.css',function(err,data) {
response.write(data);
response.end();
})
}
一个页面里,我们可能会请求非常多的静态资源,如果每次都加一个else if 显然让页面更复杂,且不利于维护。所以我们希望将所有的静态资源请求都封装在一个函数里。
function parseMime(pathname) {
var reg = /\.(HTML|JS|CSS|JSON|TXT|ICO|JPG)/i;
if (reg.test(pathname)) {
//获取请求文件的后缀名
var suffix = reg.exec(pathname)[1].toUpperCase();
//根据请求文件的后缀名获取到当前文件的MIME类型
var suffixMIME = "text/plain";
switch(suffix) {
case "HTML":
suffixMIME = "text/html";
break;
case "CSS":
suffixMIME = "text/css";
break;
case "JS":
suffixMIME = "text/javascript";
break;
case "JSON":
suffixMIME = "application/json";
break;
case "ICO":
suffixMIME = "application/octet-stream";
break;
case "JPG":
suffixMIME = "image/jpg";
break;
}
}
return suffixMIME;
}
实际上,Node中还提供了一个第三方的模块能够自动帮我们判断文件的MIME类型,我们这里还需要用到一个第三方的模块"mine"。
var mime = require('mime');
function serve(request,response) {
var url = request.url;
if (url == '/') {
//设置响应类型,编码为utf-8。
//服务器返回资源给浏览器时,还应该告诉浏览器这是什么类型的文件,以什么方式解析
response.setHeader('Content-Type','text/html;charset=utf-8');
//如果我们希望返回的是其他文件的内容,则需要先读取其他文件,这时需要fs模块来读取文件
fs.readFile('index.html',function(err,data) {
response.write(data);
response.end();
})
}else{
static(url,response)
}
}
function static(url,response) {
response.setHeader('Content-Type',mime.lookup(url) + ';charset=utf-8');
//如果我们希望返回的是其他文件的内容,则需要先读取其他文件,这时需要fs模块来读取文件
fs.readFile(url.slice(1),function(err,data) {
response.write(data);
response.end();
})
}
现在我们的url都是类似http://localhost:3000/index.html这样的,就是客户端只是单纯的获取数据,并不涉及向服务器端发送数据。
前面我们说过,request.url获取的是'3000:'之后的内容,那么当我们需要向服务器传一些内容的时候,比如说http://localhost:3000/index.html/?name="xiaoyu"。这时request.url获取的就是/index.html/?name="xiaoyu"。
这样的url显然不能再作为我们判断路径的依据,所以我们得进一步处理这个url。其实node提供了一个更加强大的url解析库给我们,这个库就是”url“。这个库能够解析整个完整的url路径。
传送地址:url模块学习小结
如何创建一个基于Node的HTTP服务器的更多相关文章
- 基于 Node.js 的服务器自动化部署搭建实录
基于 Node.js 的服务器自动化部署搭建实录 在服务器上安装 Node.js 编写拉取仓库.重启服务器脚本 配置 Github 仓库的 Webhook 设置 配置 Node.js 脚本 其他问题 ...
- CXF 入门:创建一个基于WS-Security标准的安全验证(CXF回调函数使用,)
http://jyao.iteye.com/blog/1346547 注意:以下客户端调用代码中获取服务端ws实例,都是通过CXF 入门: 远程接口调用方式实现 直入正题! 以下是服务端配置 ==== ...
- 在C#/.NET应用程序开发中创建一个基于Topshelf的应用程序守护进程(服务)
本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区. 文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf ...
- 如何创建一个基于 .NET Core 3 的 WPF 项目
在 Connect(); 2018 大会上,微软发布了 .NET Core 3 Preview,以及基于 .NET Core 3 的 WPF:同时还发布了 Visual Studio 2019 预览版 ...
- 如何创建一个基于 MSBuild Task 的跨平台的 NuGet 工具包
MSBuild 的 Task 为我们扩展项目的编译过程提供了强大的扩展性,它使得我们可以用 C# 语言编写扩展:利用这种扩展性,我们可以为我们的项目定制一部分的编译细节.NuGet 为我们提供了一种自 ...
- 如何创建一个基于命令行工具的跨平台的 NuGet 工具包
命令行可是跨进程通信的一种非常方便的手段呢,只需启动一个进程传入一些参数即可完成一些很复杂的任务.NuGet 为我们提供了一种自动导入 .props 和 .targets 的方法,同时还是一个 .NE ...
- Java中通过方法创建一个http连接并请求(服务器间进行通信)
服务器间进行通信只能通过流(Stream)的方式进行,不能用方法的返回值. 1.Java代码创建一个连接并请求该连接返回的数据 doGet()方法,execute()方法中调用 package dem ...
- javascript创建一个基于数组的栈结构
栈是一种遵从后进先出(LIFO)原则的有序集合.新添加或待删除的元素都保存在栈的同 一端,称作栈顶,另一端就叫栈底.在栈里,新元素都靠近栈顶,旧元素都接近栈底. 栈拥有以下方法: push(eleme ...
- javascript创建一个基于对象的栈结构
上篇博客介绍了基于数组创建一个栈,这是用对象创建一个栈 s1.声明一个Stack类 class Stack { constructor() { this.count = 0; this.items = ...
随机推荐
- easyui datagrid fit 属性
fit:true - 自适应大小,填充容器 fitColumns:true - 自动使列适应表格宽度以防止出现水平滚动.
- JS判断时特殊值与boolean类型的转换
扒开JQuery以及其他一些JS框架源码,常常能看到下面这样的判断,写惯了C#高级语言语法的我,一直以来没能系统的理解透这段代码. var test; //do something... if(tes ...
- django系列5.3--ORM数据库的多表操作
首先来创建一个模型,数据库的关系就清楚了 models.py from django.db import models # Create your models here. class Author( ...
- Android Studio如何用真机调试
1,在真机中设置USB调试模式打开,具体:“设置”->“应用程序”->“开发”->“USB调试”. 2,安装安卓的USB驱动,如果按照不好,那么去下载一个豌豆荚,它会帮你正确安装你的 ...
- 如何给LOJ补全special judge
首先你要会写一个叫$data.yml$的东西, 这里面记录了这道题的$subtask$计分策略 也告诉了评测姬这道题是提交答案还是$spj$还是交互题 那么,$YAML$语言是啥啊? 别问我,我也不会 ...
- Python 用队列实现多线程并发
# Python queue队列,实现并发,在网站多线程推荐最后也一个例子,比这货简单,但是不够规范 # encoding: utf-8 __author__ = 'yeayee.com' # 由本站 ...
- 一篇文章搞懂Linux安全!
Linux是开放源代码的免费正版软件,同时也是因为较之微软的Windows NT网络操作系统而言,Linux系统具有更好的稳定性.效率性和安全性. 在Internet/Intranet的大量应用中,网 ...
- vue + ElementUI 关闭对话框清空验证,清除form表单
前面跟大家提到过 elementUI验证的问题,那么今天就来看看 点击对话框和关闭按钮 怎么清空验证,清空form表单,避免二次点击还会有 验证错误的提示 1.首先在你的对话框 取消按钮 加一个cli ...
- string类型介绍
一.前言 int,float,char,C++标准库提供的类型:string,vector. string:可变长字符串的处理:vector一种集合或者容器的概念. 二.string类型简介 C++标 ...
- P5038 [SCOI2012]奇怪的游戏
题目链接 题意分析 首先我们需要求的是统一以后的值\(x\) 并且一般的棋盘操作我们都需要黑白染色 那么对于棋盘格子是偶数的情况的话 答案是存在单调性的 因为如果统一之后 两两搭配还是可以再加一个的 ...