node.js的特点
单线程:只有一个线程执行任务
非堵塞I/O:在I/O耗时操作时,线程不堵塞
事件驱动:使用事件驱动程序往下继续运行
node,js模块化
规范:遵循common.js规范
加载模块的时候同步。当遇到require() 语句时,会停下来等加载完成然后继续往下执行。
暴露模块的时候推荐通过exports.xx = 或 module.exports.xx = 或 module.exports = 向外暴露。
在node,js中,每一个JS文件就是一个模块
在node,js中,分为内置核心模块 和 自定义模块(或者第三方模块)
内置核心模块:
这些模块是node,js自带的,比如http url querystring fs(FileSystem)
引入方式:直接调用名称引入
var http = require("http");
var url = require("url");
var fs = require("fs");
自定义模块(或者第三方模块):
引入方式:使用“./”开头 加上 名称
//在A.js文件中
var b = require("./B");
注意:
但是假如自定义模块(或者第三方模块)放在node_modules目录下,放进去的模块就跟内置核心模块一样的引入方式
//在A.js文件中
//因为B.js文件放在了node_modules目录下,可以直接使用名称引入
var b = require("B");
这种方式引入,看上去像是引入了核心模块 其实只是一种假象 moduleA并不是变成了核心模块 只是引入方式一样了。
var moduleA = require("moduleA");
当同一级目录中有node_modules文件夹时,并且里面有moduleA模块 并且上一级目录中有node_modules文件夹,里面也有moduleA模块时,会引用同级目录下的node_modules文件夹中的模块
当同级有node_modules文件夹但是没有moduleA模块, 但是上级有node_modules文件夹也有moduleA模块,此时会使用上级的moduleA模块
// 注意!!!! 这种方式引入,看上去像是引入了核心模块 其实只是一种假象 moduleA并不是变成了核心模块 只是引入方式一样了。
var moduleA = require("moduleA");
// 当同一级目录中有node_modules文件夹时,并且里面有moduleA模块 并且上一级目录中有node_modules文件夹,里面也有moduleA模块时
// 此时,会引用同级目录下的node_modules文件夹中的模块
// 当同级有node_modules文件夹但是没有moduleA模块, 但是上级有node_modules文件夹也有moduleA模块,此时会使用上级的moduleA模块
模块暴露:node.js 向外暴露的方式与sea.js一样,推荐module.exports 或者exports.
module.exports.c = c;
module.exports = c;
exports.c = c;
http模块
搭建服务器
// 调用createServer来创建服务器
var server = http.createServer(function(req, res) {
})
req对象:请求对象 所有的请求时浏览器附加的信息都可以从req身上获取
req.url 请求对象中url地址的path部分(pathname + search)
注意:url地址的组成部分
req.method 请求对象中请求方式get 还是 post 返回值是大写
req.connection.remoteAddress 请求对象中访问服务器的客户端的IP地址
req.on("data", function(data_chunk){ }) 在处理post请求时,请求数据时
req.on("end", function(){ }) 在处理post请求时,请求数据完毕时
res对象:响应对象 决定返回结果给前端由res决定
res.setHeader( ) 设置响应对象的响应头
res.end(data) 该方法决定返回内容并挂断连接
注意:这里的data必须是buffer类型或者字符串类型 buffer类型调用toString()方法
res.write(data) 该方法决定返回内容但是不挂断连接
res.status 决定响应状态
监听服务器
第一个参数:端口号
第二个参数:IP地址
// 将当前服务绑定到某个端口
server.listen(3000, "192.168.2.187");
// HTTP模块用于搭建服务器
var http = require("http");
// console.log(http);
// 调用createServer来创建服务器
var server = http.createServer(function(req, res) {
// req: request 前端请求对象 所有的请求时浏览器附加的信息都可以从req身上获取
// res: response 后端响应对象 决定返回什么东西给前端由res决定
// 当前函数在每一次前端有请求到达服务器的时候会调用
// console.log(req.url); // 请求url中path部分
// console.log(req.method); // 请求类型
console.log(req.connection.remoteAddress);
})
// console.log(server);
// 将当前服务绑定到某个端口
server.listen(3000, "192.168.2.187");
url模块
是node.js的内置核心模块之一,用于解析字符串和url对象
解析字符串
url.parse(str,Boolean)
第一个参数:url字符串
第二个参数:Boolean true深解析 false浅解析
解析url对象
url.format(obj)
// 引入url模块 它是一个nodejs核心模块 作用是格式化url字符串变成一个url对象 或者将url对象转为url字符串
var url = require("url");
// 定义了一个url字符串
var url_str = "http://localhost:3000/html/index.html?a=1&b=2&c=3#aaa";
// 使用url模块的方法 格式化url_str为一个对象
var url_obj = url.parse(url_str, true);
// console.log(url_obj);
var url_str1 = url.format(url_obj);
console.log(url_str1);
fileSystem文件模块
创建文件
fs.appendFile(filePath,data,callback)
filePath:创建的文件路径
data:添加的数据
callback(err)
err:表示在读取过程中可能出现的异常 如果有异常发生 此时err是一个异常对象 如果没有异常发生 err是null
var fs = require("fs");
// 调用appendFile方法 创建一个文件
fs.appendFile("/a.txt", "111", function(err) {
});
读取文件
fs.readFile(filePath,callback)
filePath:文件路径 “./”+ url的path部分
callback(err,data)
err:表示在读取过程中可能出现的异常 如果有异常发生 此时err是一个异常对象 如果没有异常发生 err是null
data:表示在读取成功的时候读到的内容 如果有异常发生 此时data为null 如果没有异常发生 data是读到的内容
fs.readFile("./index.html", function(err, data) {
// err 表示读取文件的过程中可能出现的错误
// data 表示读取文件成功时 它是读到的文件内容
res.end(data);
});
删除文件
fs.unlink(filePath,callback)
filePath:删除的文件路径
callback(err)
err:表示在读取过程中可能出现的异常 如果有异常发生 此时err是一个异常对象 如果没有异常发生 err是null
// 当运行此文件时 要将同级目录下的index.html删除 请在运行时保证有该文件
// 引入fs模块
var fs = require("fs");
// 调用unlink 删除index.html
fs.unlink("./index.html", function(err) {
// err表示删除的过程中可能出现的异常 如果出现异常那么err是一个对象 如果没有异常 err是null
console.log(err);
});
创建目录
fs.mkdir(filePath,callback)
filePath:文件路径
callback(err)
err:表示在读取过程中可能出现的异常 如果有异常发生 此时err是一个异常对象 如果没有异常发生 err是null
// 创建目录
// 引入fs模块
var fs = require("fs");
// 调用对应的fs.mkdir
fs.mkdir("html", function(err) {
console.log(err);
});
删除文件夹(只能删除空文件夹)
fs.rmdir(filePath,callback)
filePath:文件路径
callback(err)
err:表示在读取过程中可能出现的异常 如果有异常发生 此时err是一个异常对象 如果没有异常发生 err是null
// 引入fs模块
var fs = require("fs");
// 调用rmdir
fs.rmdir("html", function(err) {
console.log(err);
});
// 该方法只可以删除空目录
读取文件夹
fs.readdir(filePath,callback)
filePath:文件路径
callback(err,arr)
err:表示在读取过程中可能出现的异常 如果有异常发生 此时err是一个异常对象 如果没有异常发生 err是null
arr:表示在读取成功的时候读到的内容 如果有异常发生 此时data为null 如果没有异常发生 data是读到的内容
// 引入fs
var fs = require("fs");
// 读取目录的方法叫做readdir
fs.readdir("相册", function(err, arr) {
console.log(err);
console.log("*************");
console.log(arr);
});
分辨目录(文件夹)和文件
fs.stat(filePath,callback)
filePath:文件路径
callback(err,stat)
err:表示在读取过程中可能出现的异常 如果有异常发生 此时err是一个异常对象 如果没有异常发生 err是null
stat:状态对象 状态对象有一个方法isDirectory()方法,该方法可以返回一个布尔值表示是否是目录
// 分辨一个路径是文件还是文件夹
var fs = require("fs");
// 调用对应的api fs.stat
fs.stat("index.html", function(err, stat) {
console.log("index.html");
console.log(err);
console.log(stat.isDirectory());
});
fs.stat("index.txt", function(err, stat) {
console.log("index.txt");
console.log(err);
console.log(stat.isDirectory());
});
删除非空文件夹(自定义一个模块实现功能)
// 引入fs模块
var fs = require("fs");
// 当前模块提供一个功能 将一个目录变成空的 并删除该目录
function del(path) {
// 读取path目录 获取内部的所有文件和文件夹名称
var arr = fs.readdirSync(path);
console.log(arr);
// 挨个判断里面的每一项是文件还是文件夹
for(var i = 0; i < arr.length; i++) {
// 调用stat的同步方法判定文件的状态
var stat = fs.statSync(path + "/" + arr[i]);
// 如果是一个文件夹
if(stat.isDirectory()) {
del(path + "/" + arr[i]);
} else {
// 如果是一个文件
fs.unlinkSync(path + "/" + arr[i]);
}
}
// 当代码执行到这里 说明该路径下的所有文件和文件夹都已经没有了
fs.rmdirSync(path);
}
module.exports = del;
重命名文件(更改文件路径)
fs.rename(oldPath,newPath,callback)
oldPath:旧文件路径
newPath:新文件路径
callback(err)
err:表示在读取过程中可能出现的异常 如果有异常发生 此时err是一个异常对象 如果没有异常发生 err是null
var fs = require("fs");
fs.rename("./static/index.txt", "./static/index2.txt", function() {
res.end("成功");
})
工作目录 文件目录
process.cwd() 该方法返回工作目录 在哪个目录下运行的node命令 工作目录就是哪个
__dirname 该属性指向被运行的文件所在的目录
切记: 一定在运行文件的时候 切换到该文件所在目录下 让两个路径统一。
querystring模块
该模块的功能就是将query字符串转为对象,或者将对象转为query字符串
// 加载queryString模块
var qs = require("querystring");
// 定义字符串
var str = "username=王老五&password=123123&sex=男&hobby=乒乓球&hobby=JavaScript";
console.log(qs.parse(str));
静态服务器
静态服务器就是指不能够处理表单,不能够进行逻辑交互的服务器。只能够呆板的将服务器上的真实存在的文件提供出来
var http = require("http");
var fs = require("fs");
var url = require("url");
var MIMEType = {
"*" :"application/octet-stream",
"323" :"text/h323",
"acx" :"application/internet-property-stream",
"ai" :"application/postscript",
"aif" :"audio/x-aiff",
"aifc" :"audio/x-aiff",
"aiff" :"audio/x-aiff",
"asf" :"video/x-ms-asf",
"asr" :"video/x-ms-asf",
"asx" :"video/x-ms-asf",
"au" :"audio/basic",
"avi" :"video/x-msvideo",
"axs" :"application/olescript",
"bas" :"text/plain",
"bcpio" :"application/x-bcpio",
"bin" :"application/octet-stream",
"bmp" :"image/bmp",
"c" :"text/plain",
"cat" :"application/vnd.ms-pkiseccat",
"cdf" :"application/x-cdf",
"cer" :"application/x-x509-ca-cert",
"class" :"application/octet-stream",
"clp" :"application/x-msclip",
"cmx" :"image/x-cmx",
"cod" :"image/cis-cod",
"cpio" :"application/x-cpio",
"crd" :"application/x-mscardfile",
"crl" :"application/pkix-crl",
"crt" :"application/x-x509-ca-cert",
"csh" :"application/x-csh",
"css" :"text/css",
"dcr" :"application/x-director",
"der" :"application/x-x509-ca-cert",
"dir" :"application/x-director",
"dll" :"application/x-msdownload",
"dms" :"application/octet-stream",
"doc" :"application/msword",
"dot" :"application/msword",
"dvi" :"application/x-dvi",
"dxr" :"application/x-director",
"eps" :"application/postscript",
"etx" :"text/x-setext",
"evy" :"application/envoy",
"exe" :"application/octet-stream",
"fif" :"application/fractals",
"flr" :"x-world/x-vrml",
"gif" :"image/gif",
"gtar" :"application/x-gtar",
"gz" :"application/x-gzip",
"h" :"text/plain",
"hdf" :"application/x-hdf",
"hlp" :"application/winhlp",
"hqx" :"application/mac-binhex40",
"hta" :"application/hta",
"htc" :"text/x-component",
"htm" :"text/html",
"html" :"text/html",
"htt" :"text/webviewhtml",
"ico" :"image/x-icon",
"ief" :"image/ief",
"iii" :"application/x-iphone",
"ins" :"application/x-internet-signup",
"isp" :"application/x-internet-signup",
"jfif" :"image/pipeg",
"jpe" :"image/jpeg",
"jpeg" :"image/jpeg",
"jpg" :"image/jpeg",
"js" :"application/x-javascript",
"latex" :"application/x-latex",
"lha" :"application/octet-stream",
"lsf" :"video/x-la-asf",
"lsx" :"video/x-la-asf",
"lzh" :"application/octet-stream",
"m13" :"application/x-msmediaview",
"m14" :"application/x-msmediaview",
"m3u" :"audio/x-mpegurl",
"man" :"application/x-troff-man",
"mdb" :"application/x-msaccess",
"me" :"application/x-troff-me",
"mht" :"message/rfc822",
"mhtml" :"message/rfc822",
"mid" :"audio/mid",
"mny" :"application/x-msmoney",
"mov" :"video/quicktime",
"movie" :"video/x-sgi-movie",
"mp2" :"video/mpeg",
"mp3" :"audio/mpeg",
"mpa" :"video/mpeg",
"mpe" :"video/mpeg",
"mpeg" :"video/mpeg",
"mpg" :"video/mpeg",
"mpp" :"application/vnd.ms-project",
"mpv2" :"video/mpeg",
"ms" :"application/x-troff-ms",
"mvb" :"application/x-msmediaview",
"nws" :"message/rfc822",
"oda" :"application/oda",
"p10" :"application/pkcs10",
"p12" :"application/x-pkcs12",
"p7b" :"application/x-pkcs7-certificates",
"p7c" :"application/x-pkcs7-mime",
"p7m" :"application/x-pkcs7-mime",
"p7r" :"application/x-pkcs7-certreqresp",
"p7s" :"application/x-pkcs7-signature",
"pbm" :"image/x-portable-bitmap",
"pdf" :"application/pdf",
"pfx" :"application/x-pkcs12",
"pgm" :"image/x-portable-graymap",
"pko" :"application/ynd.ms-pkipko",
"pma" :"application/x-perfmon",
"pmc" :"application/x-perfmon",
"pml" :"application/x-perfmon",
"pmr" :"application/x-perfmon",
"pmw" :"application/x-perfmon",
"pnm" :"image/x-portable-anymap",
"pot" :"application/vnd.ms-powerpoint",
"ppm" :"image/x-portable-pixmap",
"pps" :"application/vnd.ms-powerpoint",
"ppt" :"application/vnd.ms-powerpoint",
"prf" :"application/pics-rules",
"ps" :"application/postscript",
"pub" :"application/x-mspublisher",
"qt" :"video/quicktime",
"ra" :"audio/x-pn-realaudio",
"ram" :"audio/x-pn-realaudio",
"ras" :"image/x-cmu-raster",
"rgb" :"image/x-rgb",
"rmi" :"audio/mid http://www.dreamdu.com",
"roff" :"application/x-troff",
"rtf" :"application/rtf",
"rtx" :"text/richtext",
"scd" :"application/x-msschedule",
"sct" :"text/scriptlet",
"setpay" :"application/set-payment-initiation",
"setreg" :"application/set-registration-initiation",
"sh" :"application/x-sh",
"shar" :"application/x-shar",
"sit" :"application/x-stuffit",
"snd" :"audio/basic",
"spc" :"application/x-pkcs7-certificates",
"spl" :"application/futuresplash",
"src" :"application/x-wais-source",
"sst" :"application/vnd.ms-pkicertstore",
"stl" :"application/vnd.ms-pkistl",
"stm" :"text/html",
"svg" :"image/svg+xml",
"sv4cpio" :"application/x-sv4cpio",
"sv4crc" :"application/x-sv4crc",
"swf" :"application/x-shockwave-flash",
"t" :"application/x-troff",
"tar" :"application/x-tar",
"tcl" :"application/x-tcl",
"tex" :"application/x-tex",
"texi" :"application/x-texinfo",
"texinfo" :"application/x-texinfo",
"tgz" :"application/x-compressed",
"tif" :"image/tiff",
"tiff" :"image/tiff",
"tr" :"application/x-troff",
"trm" :"application/x-msterminal",
"tsv" :"text/tab-separated-values",
"txt" :"text/plain",
"uls" :"text/iuls",
"ustar" :"application/x-ustar",
"vcf" :"text/x-vcard",
"vrml" :"x-world/x-vrml",
"wav" :"audio/x-wav",
"wcm" :"application/vnd.ms-works",
"wdb" :"application/vnd.ms-works",
"wks" :"application/vnd.ms-works",
"wmf" :"application/x-msmetafile",
"wps" :"application/vnd.ms-works",
"wri" :"application/x-mswrite",
"wrl" :"x-world/x-vrml",
"wrz" :"x-world/x-vrml",
"xaf" :"x-world/x-vrml",
"xbm" :"image/x-xbitmap",
"xla" :"application/vnd.ms-excel",
"xlc" :"application/vnd.ms-excel",
"xlm" :"application/vnd.ms-excel",
"xls" :"application/vnd.ms-excel",
"xlt" :"application/vnd.ms-excel",
"xlw" :"application/vnd.ms-excel",
"xof" :"x-world/x-vrml",
"xpm" :"image/x-xpixmap",
"xwd" :"image/x-xwindowdump",
"z" :"application/x-compress",
"zip" :"application/zip"
}
var server = http.createServer(function(req, res) {
// 静态服务器: 前端请求什么文件 我们就读取 . + 路径
var url_obj = url.parse(req.url);
var pathname = url_obj.pathname;
fs.readFile("." + pathname, function(err, data) {
if(err) {
// 设置编码
res.setHeader("content-type", "text/plain;charset=utf-8");
// 说明读取错误
res.end("抱歉,您读取的" + pathname + "文件不存在");
return;
}
// 获取用户读取的文件的后缀名
var extName = pathname.split(".").pop();
res.setHeader("content-type", MIMEType[extName] + ";charset=utf-8");
// 如果代码能够执行到这里 说明读取成功
res.end(data);
});
})
server.listen(3000);
处理get请求
Node处理get请求就是通过获取req.url并使用url模块进行处理得到数据。
var http = require("http");
var fs = require("fs");
var url = require("url");
var MIMEType = {
"*" :"application/octet-stream",
"323" :"text/h323",
"acx" :"application/internet-property-stream",
"ai" :"application/postscript",
"aif" :"audio/x-aiff",
"aifc" :"audio/x-aiff",
"aiff" :"audio/x-aiff",
"asf" :"video/x-ms-asf",
"asr" :"video/x-ms-asf",
"asx" :"video/x-ms-asf",
"au" :"audio/basic",
"avi" :"video/x-msvideo",
"axs" :"application/olescript",
"bas" :"text/plain",
"bcpio" :"application/x-bcpio",
"bin" :"application/octet-stream",
"bmp" :"image/bmp",
"c" :"text/plain",
"cat" :"application/vnd.ms-pkiseccat",
"cdf" :"application/x-cdf",
"cer" :"application/x-x509-ca-cert",
"class" :"application/octet-stream",
"clp" :"application/x-msclip",
"cmx" :"image/x-cmx",
"cod" :"image/cis-cod",
"cpio" :"application/x-cpio",
"crd" :"application/x-mscardfile",
"crl" :"application/pkix-crl",
"crt" :"application/x-x509-ca-cert",
"csh" :"application/x-csh",
"css" :"text/css",
"dcr" :"application/x-director",
"der" :"application/x-x509-ca-cert",
"dir" :"application/x-director",
"dll" :"application/x-msdownload",
"dms" :"application/octet-stream",
"doc" :"application/msword",
"dot" :"application/msword",
"dvi" :"application/x-dvi",
"dxr" :"application/x-director",
"eps" :"application/postscript",
"etx" :"text/x-setext",
"evy" :"application/envoy",
"exe" :"application/octet-stream",
"fif" :"application/fractals",
"flr" :"x-world/x-vrml",
"gif" :"image/gif",
"gtar" :"application/x-gtar",
"gz" :"application/x-gzip",
"h" :"text/plain",
"hdf" :"application/x-hdf",
"hlp" :"application/winhlp",
"hqx" :"application/mac-binhex40",
"hta" :"application/hta",
"htc" :"text/x-component",
"htm" :"text/html",
"html" :"text/html",
"htt" :"text/webviewhtml",
"ico" :"image/x-icon",
"ief" :"image/ief",
"iii" :"application/x-iphone",
"ins" :"application/x-internet-signup",
"isp" :"application/x-internet-signup",
"jfif" :"image/pipeg",
"jpe" :"image/jpeg",
"jpeg" :"image/jpeg",
"jpg" :"image/jpeg",
"js" :"application/x-javascript",
"latex" :"application/x-latex",
"lha" :"application/octet-stream",
"lsf" :"video/x-la-asf",
"lsx" :"video/x-la-asf",
"lzh" :"application/octet-stream",
"m13" :"application/x-msmediaview",
"m14" :"application/x-msmediaview",
"m3u" :"audio/x-mpegurl",
"man" :"application/x-troff-man",
"mdb" :"application/x-msaccess",
"me" :"application/x-troff-me",
"mht" :"message/rfc822",
"mhtml" :"message/rfc822",
"mid" :"audio/mid",
"mny" :"application/x-msmoney",
"mov" :"video/quicktime",
"movie" :"video/x-sgi-movie",
"mp2" :"video/mpeg",
"mp3" :"audio/mpeg",
"mpa" :"video/mpeg",
"mpe" :"video/mpeg",
"mpeg" :"video/mpeg",
"mpg" :"video/mpeg",
"mpp" :"application/vnd.ms-project",
"mpv2" :"video/mpeg",
"ms" :"application/x-troff-ms",
"mvb" :"application/x-msmediaview",
"nws" :"message/rfc822",
"oda" :"application/oda",
"p10" :"application/pkcs10",
"p12" :"application/x-pkcs12",
"p7b" :"application/x-pkcs7-certificates",
"p7c" :"application/x-pkcs7-mime",
"p7m" :"application/x-pkcs7-mime",
"p7r" :"application/x-pkcs7-certreqresp",
"p7s" :"application/x-pkcs7-signature",
"pbm" :"image/x-portable-bitmap",
"pdf" :"application/pdf",
"pfx" :"application/x-pkcs12",
"pgm" :"image/x-portable-graymap",
"pko" :"application/ynd.ms-pkipko",
"pma" :"application/x-perfmon",
"pmc" :"application/x-perfmon",
"pml" :"application/x-perfmon",
"pmr" :"application/x-perfmon",
"pmw" :"application/x-perfmon",
"pnm" :"image/x-portable-anymap",
"pot" :"application/vnd.ms-powerpoint",
"ppm" :"image/x-portable-pixmap",
"pps" :"application/vnd.ms-powerpoint",
"ppt" :"application/vnd.ms-powerpoint",
"prf" :"application/pics-rules",
"ps" :"application/postscript",
"pub" :"application/x-mspublisher",
"qt" :"video/quicktime",
"ra" :"audio/x-pn-realaudio",
"ram" :"audio/x-pn-realaudio",
"ras" :"image/x-cmu-raster",
"rgb" :"image/x-rgb",
"rmi" :"audio/mid http://www.dreamdu.com",
"roff" :"application/x-troff",
"rtf" :"application/rtf",
"rtx" :"text/richtext",
"scd" :"application/x-msschedule",
"sct" :"text/scriptlet",
"setpay" :"application/set-payment-initiation",
"setreg" :"application/set-registration-initiation",
"sh" :"application/x-sh",
"shar" :"application/x-shar",
"sit" :"application/x-stuffit",
"snd" :"audio/basic",
"spc" :"application/x-pkcs7-certificates",
"spl" :"application/futuresplash",
"src" :"application/x-wais-source",
"sst" :"application/vnd.ms-pkicertstore",
"stl" :"application/vnd.ms-pkistl",
"stm" :"text/html",
"svg" :"image/svg+xml",
"sv4cpio" :"application/x-sv4cpio",
"sv4crc" :"application/x-sv4crc",
"swf" :"application/x-shockwave-flash",
"t" :"application/x-troff",
"tar" :"application/x-tar",
"tcl" :"application/x-tcl",
"tex" :"application/x-tex",
"texi" :"application/x-texinfo",
"texinfo" :"application/x-texinfo",
"tgz" :"application/x-compressed",
"tif" :"image/tiff",
"tiff" :"image/tiff",
"tr" :"application/x-troff",
"trm" :"application/x-msterminal",
"tsv" :"text/tab-separated-values",
"txt" :"text/plain",
"uls" :"text/iuls",
"ustar" :"application/x-ustar",
"vcf" :"text/x-vcard",
"vrml" :"x-world/x-vrml",
"wav" :"audio/x-wav",
"wcm" :"application/vnd.ms-works",
"wdb" :"application/vnd.ms-works",
"wks" :"application/vnd.ms-works",
"wmf" :"application/x-msmetafile",
"wps" :"application/vnd.ms-works",
"wri" :"application/x-mswrite",
"wrl" :"x-world/x-vrml",
"wrz" :"x-world/x-vrml",
"xaf" :"x-world/x-vrml",
"xbm" :"image/x-xbitmap",
"xla" :"application/vnd.ms-excel",
"xlc" :"application/vnd.ms-excel",
"xlm" :"application/vnd.ms-excel",
"xls" :"application/vnd.ms-excel",
"xlt" :"application/vnd.ms-excel",
"xlw" :"application/vnd.ms-excel",
"xof" :"x-world/x-vrml",
"xpm" :"image/x-xpixmap",
"xwd" :"image/x-xwindowdump",
"z" :"application/x-compress",
"zip" :"application/zip"
}
var server = http.createServer(function(req, res) {
// 静态服务器: 前端请求什么文件 我们就读取 . + 路径
var url_obj = url.parse(req.url);
var pathname = url_obj.pathname;
// 获取请求方式
var method = req.method.toLowerCase();
// 此时 静态服务器不足以支持交互功能
// 想要匹配/regist需要单独判断
// 所有非文件的请求 都统称接口
if(pathname === "/aaaaa" && method === "get") {
// 获取前端提交过来的数据
console.log(decodeURIComponent(req.url));
// 获取query部分 并转为对象
var query = url.parse(decodeURIComponent(req.url), true).query;
console.log(query);
return;
}
fs.readFile("." + pathname, function(err, data) {
if(err) {
// 设置编码
res.setHeader("content-type", "text/plain;charset=utf-8");
// 说明读取错误
res.end("抱歉,您读取的" + pathname + "文件不存在");
return;
}
// 获取用户读取的文件的后缀名
var extName = pathname.split(".").pop();
res.setHeader("content-type", MIMEType[extName] + ";charset=utf-8");
// 如果代码能够执行到这里 说明读取成功
res.end(data);
});
})
server.listen(3000);
处理post请求
post请求与get请求不一样,因为post请求携带的数据放在请求正文中,而请求正文可携带数据没有上限,所以,很可能一次性传递数据传递不完。 要多次传递。
Nodejs设定了两个事件 一个是data事件,在每一次数据传递过来后触发。另一个是end事件,在所有数据传递完毕之后触发。后续代码要写在end事件中。
var http = require("http");
var fs = require("fs");
var url = require("url");
var MIMEType = {
"*" :"application/octet-stream",
"323" :"text/h323",
"acx" :"application/internet-property-stream",
"ai" :"application/postscript",
"aif" :"audio/x-aiff",
"aifc" :"audio/x-aiff",
"aiff" :"audio/x-aiff",
"asf" :"video/x-ms-asf",
"asr" :"video/x-ms-asf",
"asx" :"video/x-ms-asf",
"au" :"audio/basic",
"avi" :"video/x-msvideo",
"axs" :"application/olescript",
"bas" :"text/plain",
"bcpio" :"application/x-bcpio",
"bin" :"application/octet-stream",
"bmp" :"image/bmp",
"c" :"text/plain",
"cat" :"application/vnd.ms-pkiseccat",
"cdf" :"application/x-cdf",
"cer" :"application/x-x509-ca-cert",
"class" :"application/octet-stream",
"clp" :"application/x-msclip",
"cmx" :"image/x-cmx",
"cod" :"image/cis-cod",
"cpio" :"application/x-cpio",
"crd" :"application/x-mscardfile",
"crl" :"application/pkix-crl",
"crt" :"application/x-x509-ca-cert",
"csh" :"application/x-csh",
"css" :"text/css",
"dcr" :"application/x-director",
"der" :"application/x-x509-ca-cert",
"dir" :"application/x-director",
"dll" :"application/x-msdownload",
"dms" :"application/octet-stream",
"doc" :"application/msword",
"dot" :"application/msword",
"dvi" :"application/x-dvi",
"dxr" :"application/x-director",
"eps" :"application/postscript",
"etx" :"text/x-setext",
"evy" :"application/envoy",
"exe" :"application/octet-stream",
"fif" :"application/fractals",
"flr" :"x-world/x-vrml",
"gif" :"image/gif",
"gtar" :"application/x-gtar",
"gz" :"application/x-gzip",
"h" :"text/plain",
"hdf" :"application/x-hdf",
"hlp" :"application/winhlp",
"hqx" :"application/mac-binhex40",
"hta" :"application/hta",
"htc" :"text/x-component",
"htm" :"text/html",
"html" :"text/html",
"htt" :"text/webviewhtml",
"ico" :"image/x-icon",
"ief" :"image/ief",
"iii" :"application/x-iphone",
"ins" :"application/x-internet-signup",
"isp" :"application/x-internet-signup",
"jfif" :"image/pipeg",
"jpe" :"image/jpeg",
"jpeg" :"image/jpeg",
"jpg" :"image/jpeg",
"js" :"application/x-javascript",
"latex" :"application/x-latex",
"lha" :"application/octet-stream",
"lsf" :"video/x-la-asf",
"lsx" :"video/x-la-asf",
"lzh" :"application/octet-stream",
"m13" :"application/x-msmediaview",
"m14" :"application/x-msmediaview",
"m3u" :"audio/x-mpegurl",
"man" :"application/x-troff-man",
"mdb" :"application/x-msaccess",
"me" :"application/x-troff-me",
"mht" :"message/rfc822",
"mhtml" :"message/rfc822",
"mid" :"audio/mid",
"mny" :"application/x-msmoney",
"mov" :"video/quicktime",
"movie" :"video/x-sgi-movie",
"mp2" :"video/mpeg",
"mp3" :"audio/mpeg",
"mpa" :"video/mpeg",
"mpe" :"video/mpeg",
"mpeg" :"video/mpeg",
"mpg" :"video/mpeg",
"mpp" :"application/vnd.ms-project",
"mpv2" :"video/mpeg",
"ms" :"application/x-troff-ms",
"mvb" :"application/x-msmediaview",
"nws" :"message/rfc822",
"oda" :"application/oda",
"p10" :"application/pkcs10",
"p12" :"application/x-pkcs12",
"p7b" :"application/x-pkcs7-certificates",
"p7c" :"application/x-pkcs7-mime",
"p7m" :"application/x-pkcs7-mime",
"p7r" :"application/x-pkcs7-certreqresp",
"p7s" :"application/x-pkcs7-signature",
"pbm" :"image/x-portable-bitmap",
"pdf" :"application/pdf",
"pfx" :"application/x-pkcs12",
"pgm" :"image/x-portable-graymap",
"pko" :"application/ynd.ms-pkipko",
"pma" :"application/x-perfmon",
"pmc" :"application/x-perfmon",
"pml" :"application/x-perfmon",
"pmr" :"application/x-perfmon",
"pmw" :"application/x-perfmon",
"pnm" :"image/x-portable-anymap",
"pot" :"application/vnd.ms-powerpoint",
"ppm" :"image/x-portable-pixmap",
"pps" :"application/vnd.ms-powerpoint",
"ppt" :"application/vnd.ms-powerpoint",
"prf" :"application/pics-rules",
"ps" :"application/postscript",
"pub" :"application/x-mspublisher",
"qt" :"video/quicktime",
"ra" :"audio/x-pn-realaudio",
"ram" :"audio/x-pn-realaudio",
"ras" :"image/x-cmu-raster",
"rgb" :"image/x-rgb",
"rmi" :"audio/mid http://www.dreamdu.com",
"roff" :"application/x-troff",
"rtf" :"application/rtf",
"rtx" :"text/richtext",
"scd" :"application/x-msschedule",
"sct" :"text/scriptlet",
"setpay" :"application/set-payment-initiation",
"setreg" :"application/set-registration-initiation",
"sh" :"application/x-sh",
"shar" :"application/x-shar",
"sit" :"application/x-stuffit",
"snd" :"audio/basic",
"spc" :"application/x-pkcs7-certificates",
"spl" :"application/futuresplash",
"src" :"application/x-wais-source",
"sst" :"application/vnd.ms-pkicertstore",
"stl" :"application/vnd.ms-pkistl",
"stm" :"text/html",
"svg" :"image/svg+xml",
"sv4cpio" :"application/x-sv4cpio",
"sv4crc" :"application/x-sv4crc",
"swf" :"application/x-shockwave-flash",
"t" :"application/x-troff",
"tar" :"application/x-tar",
"tcl" :"application/x-tcl",
"tex" :"application/x-tex",
"texi" :"application/x-texinfo",
"texinfo" :"application/x-texinfo",
"tgz" :"application/x-compressed",
"tif" :"image/tiff",
"tiff" :"image/tiff",
"tr" :"application/x-troff",
"trm" :"application/x-msterminal",
"tsv" :"text/tab-separated-values",
"txt" :"text/plain",
"uls" :"text/iuls",
"ustar" :"application/x-ustar",
"vcf" :"text/x-vcard",
"vrml" :"x-world/x-vrml",
"wav" :"audio/x-wav",
"wcm" :"application/vnd.ms-works",
"wdb" :"application/vnd.ms-works",
"wks" :"application/vnd.ms-works",
"wmf" :"application/x-msmetafile",
"wps" :"application/vnd.ms-works",
"wri" :"application/x-mswrite",
"wrl" :"x-world/x-vrml",
"wrz" :"x-world/x-vrml",
"xaf" :"x-world/x-vrml",
"xbm" :"image/x-xbitmap",
"xla" :"application/vnd.ms-excel",
"xlc" :"application/vnd.ms-excel",
"xlm" :"application/vnd.ms-excel",
"xls" :"application/vnd.ms-excel",
"xlt" :"application/vnd.ms-excel",
"xlw" :"application/vnd.ms-excel",
"xof" :"x-world/x-vrml",
"xpm" :"image/x-xpixmap",
"xwd" :"image/x-xwindowdump",
"z" :"application/x-compress",
"zip" :"application/zip"
}
var server = http.createServer(function(req, res) {
// 静态服务器: 前端请求什么文件 我们就读取 . + 路径
var url_obj = url.parse(req.url);
var pathname = url_obj.pathname;
// 获取请求方式
var method = req.method.toLowerCase();
// 匹配/aaaaa post请求
if(pathname === "/aaaaa" && method === "post") {
// 如何得到请求正文中的数据?
// 请求正文与URL的区别就在于携带的数据量大小。 URL撑死了2K 也可以一次性获取。可以同步.
// 考虑到请求正文的容量可能很大。一次性接收不完所有数据,于是node提供了两个事件。
// data事件: 每当post请求有一次数据传递,就会触发。
// end事件: 每当post请求的最后一次数据传递完毕,才会触发 后续代码可以写在end事件内。
var str = "";
req.on("data", function(data_chunk) {
console.log("接受一次数据")
str += data_chunk;
});
req.on("end", function() {
console.log("所有的数据接收完毕")
// console.log(decodeURIComponent(str));
// 后续逻辑写在这里
})
return;
}
fs.readFile("." + pathname, function(err, data) {
if(err) {
// 设置编码
res.setHeader("content-type", "text/plain;charset=utf-8");
// 说明读取错误
res.end("抱歉,您读取的" + pathname + "文件不存在");
return;
}
// 获取用户读取的文件的后缀名
var extName = pathname.split(".").pop();
res.setHeader("content-type", MIMEType[extName] + ";charset=utf-8");
// 如果代码能够执行到这里 说明读取成功
res.end(data);
});
})
server.listen(3000);
举例:登录注册的server.js
// 搭建服务器
var http = require("http");
// 读取文件
var fs = require("fs");
// 引入url
var url = require("url");
// 引入 querystring模块
var qs = require("querystring");
// 定义一个MIMEType类型对象
var MIMEType = {
"*" :"application/octet-stream",
"323" :"text/h323",
"acx" :"application/internet-property-stream",
"ai" :"application/postscript",
"aif" :"audio/x-aiff",
"aifc" :"audio/x-aiff",
"aiff" :"audio/x-aiff",
"asf" :"video/x-ms-asf",
"asr" :"video/x-ms-asf",
"asx" :"video/x-ms-asf",
"au" :"audio/basic",
"avi" :"video/x-msvideo",
"axs" :"application/olescript",
"bas" :"text/plain",
"bcpio" :"application/x-bcpio",
"bin" :"application/octet-stream",
"bmp" :"image/bmp",
"c" :"text/plain",
"cat" :"application/vnd.ms-pkiseccat",
"cdf" :"application/x-cdf",
"cer" :"application/x-x509-ca-cert",
"class" :"application/octet-stream",
"clp" :"application/x-msclip",
"cmx" :"image/x-cmx",
"cod" :"image/cis-cod",
"cpio" :"application/x-cpio",
"crd" :"application/x-mscardfile",
"crl" :"application/pkix-crl",
"crt" :"application/x-x509-ca-cert",
"csh" :"application/x-csh",
"css" :"text/css",
"dcr" :"application/x-director",
"der" :"application/x-x509-ca-cert",
"dir" :"application/x-director",
"dll" :"application/x-msdownload",
"dms" :"application/octet-stream",
"doc" :"application/msword",
"dot" :"application/msword",
"dvi" :"application/x-dvi",
"dxr" :"application/x-director",
"eps" :"application/postscript",
"etx" :"text/x-setext",
"evy" :"application/envoy",
"exe" :"application/octet-stream",
"fif" :"application/fractals",
"flr" :"x-world/x-vrml",
"gif" :"image/gif",
"gtar" :"application/x-gtar",
"gz" :"application/x-gzip",
"h" :"text/plain",
"hdf" :"application/x-hdf",
"hlp" :"application/winhlp",
"hqx" :"application/mac-binhex40",
"hta" :"application/hta",
"htc" :"text/x-component",
"htm" :"text/html",
"html" :"text/html",
"htt" :"text/webviewhtml",
"ico" :"image/x-icon",
"ief" :"image/ief",
"iii" :"application/x-iphone",
"ins" :"application/x-internet-signup",
"isp" :"application/x-internet-signup",
"jfif" :"image/pipeg",
"jpe" :"image/jpeg",
"jpeg" :"image/jpeg",
"jpg" :"image/jpeg",
"js" :"application/x-javascript",
"latex" :"application/x-latex",
"lha" :"application/octet-stream",
"lsf" :"video/x-la-asf",
"lsx" :"video/x-la-asf",
"lzh" :"application/octet-stream",
"m13" :"application/x-msmediaview",
"m14" :"application/x-msmediaview",
"m3u" :"audio/x-mpegurl",
"man" :"application/x-troff-man",
"mdb" :"application/x-msaccess",
"me" :"application/x-troff-me",
"mht" :"message/rfc822",
"mhtml" :"message/rfc822",
"mid" :"audio/mid",
"mny" :"application/x-msmoney",
"mov" :"video/quicktime",
"movie" :"video/x-sgi-movie",
"mp2" :"video/mpeg",
"mp3" :"audio/mpeg",
"mpa" :"video/mpeg",
"mpe" :"video/mpeg",
"mpeg" :"video/mpeg",
"mpg" :"video/mpeg",
"mpp" :"application/vnd.ms-project",
"mpv2" :"video/mpeg",
"ms" :"application/x-troff-ms",
"mvb" :"application/x-msmediaview",
"nws" :"message/rfc822",
"oda" :"application/oda",
"p10" :"application/pkcs10",
"p12" :"application/x-pkcs12",
"p7b" :"application/x-pkcs7-certificates",
"p7c" :"application/x-pkcs7-mime",
"p7m" :"application/x-pkcs7-mime",
"p7r" :"application/x-pkcs7-certreqresp",
"p7s" :"application/x-pkcs7-signature",
"pbm" :"image/x-portable-bitmap",
"pdf" :"application/pdf",
"pfx" :"application/x-pkcs12",
"pgm" :"image/x-portable-graymap",
"pko" :"application/ynd.ms-pkipko",
"pma" :"application/x-perfmon",
"pmc" :"application/x-perfmon",
"pml" :"application/x-perfmon",
"pmr" :"application/x-perfmon",
"pmw" :"application/x-perfmon",
"pnm" :"image/x-portable-anymap",
"pot" :"application/vnd.ms-powerpoint",
"ppm" :"image/x-portable-pixmap",
"pps" :"application/vnd.ms-powerpoint",
"ppt" :"application/vnd.ms-powerpoint",
"prf" :"application/pics-rules",
"ps" :"application/postscript",
"pub" :"application/x-mspublisher",
"qt" :"video/quicktime",
"ra" :"audio/x-pn-realaudio",
"ram" :"audio/x-pn-realaudio",
"ras" :"image/x-cmu-raster",
"rgb" :"image/x-rgb",
"rmi" :"audio/mid http://www.dreamdu.com",
"roff" :"application/x-troff",
"rtf" :"application/rtf",
"rtx" :"text/richtext",
"scd" :"application/x-msschedule",
"sct" :"text/scriptlet",
"setpay" :"application/set-payment-initiation",
"setreg" :"application/set-registration-initiation",
"sh" :"application/x-sh",
"shar" :"application/x-shar",
"sit" :"application/x-stuffit",
"snd" :"audio/basic",
"spc" :"application/x-pkcs7-certificates",
"spl" :"application/futuresplash",
"src" :"application/x-wais-source",
"sst" :"application/vnd.ms-pkicertstore",
"stl" :"application/vnd.ms-pkistl",
"stm" :"text/html",
"svg" :"image/svg+xml",
"sv4cpio" :"application/x-sv4cpio",
"sv4crc" :"application/x-sv4crc",
"swf" :"application/x-shockwave-flash",
"t" :"application/x-troff",
"tar" :"application/x-tar",
"tcl" :"application/x-tcl",
"tex" :"application/x-tex",
"texi" :"application/x-texinfo",
"texinfo" :"application/x-texinfo",
"tgz" :"application/x-compressed",
"tif" :"image/tiff",
"tiff" :"image/tiff",
"tr" :"application/x-troff",
"trm" :"application/x-msterminal",
"tsv" :"text/tab-separated-values",
"txt" :"text/plain",
"uls" :"text/iuls",
"ustar" :"application/x-ustar",
"vcf" :"text/x-vcard",
"vrml" :"x-world/x-vrml",
"wav" :"audio/x-wav",
"wcm" :"application/vnd.ms-works",
"wdb" :"application/vnd.ms-works",
"wks" :"application/vnd.ms-works",
"wmf" :"application/x-msmetafile",
"wps" :"application/vnd.ms-works",
"wri" :"application/x-mswrite",
"wrl" :"x-world/x-vrml",
"wrz" :"x-world/x-vrml",
"xaf" :"x-world/x-vrml",
"xbm" :"image/x-xbitmap",
"xla" :"application/vnd.ms-excel",
"xlc" :"application/vnd.ms-excel",
"xlm" :"application/vnd.ms-excel",
"xls" :"application/vnd.ms-excel",
"xlt" :"application/vnd.ms-excel",
"xlw" :"application/vnd.ms-excel",
"xof" :"x-world/x-vrml",
"xpm" :"image/x-xpixmap",
"xwd" :"image/x-xwindowdump",
"z" :"application/x-compress",
"zip" :"application/zip"
}
// 定义一个数组 当做临时的数据库
var db = [];
// 调用方法创建服务器
var server = http.createServer(function(req, res) {
var url_obj = url.parse(req.url);
var url_str = url_obj.pathname;
// 请求方式
var type = req.method.toLowerCase();
// 判定注册路由
if(url_str === "/regist" && type === "post") {
// 设定响应头
res.setHeader("content-type", "text/plain;charset=utf-8");
// 定义变量 负责接受数据
var str = "";
// 说明是post请求提交
req.on("data", function(data_chunk) {
str += data_chunk;
});
// 设定end事件
req.on("end", function() {
var query = decodeURIComponent(str);
var obj = qs.parse(query);
console.log(obj);
for(var i = 0; i < db.length; i++) {
if(db[i].username === obj.username) {
// 说明有重复的了
res.end("抱歉,用户名已经被占用");
return;
}
}
// 说明没有重复的
db.push(obj);
// 将数据放入数组 并且提示用户 注册成功
res.end("恭喜,注册成功");
});
// 中止函数的执行
return;
}
// 判定登录路由
if(url_str === "/login" && type === "post") {
// 设置响应头
res.setHeader("content-type", "text/plain;charset=utf-8");
// 定义变量
var data = "";
// 获取前端提交过来的数据
req.on("data", function(data_chunk) {
data += data_chunk;
});
// 监听end事件
req.on("end", function() {
console.log(data);
// 获取解码后的数据
var obj = qs.parse(decodeURIComponent(data));
console.log(obj);
// 循环与数组中的每一条数据 比较
for(var i = 0; i < db.length; i++) {
if(db[i].username === obj.username && db[i].password === obj.password) {
// 说明登陆成功
// 返回信息给前端
fs.readFile("html/welcome.html", function(err, data) {
if(err) {
console.log("读取失败");
return;
}
res.setHeader("content-type", "text/html;charset=utf-8");
res.end(data);
})
return;
}
}
// 如果执行到这里 说明一条数据也没对上
res.end("抱歉 登录失败");
});
return;
}
// 此时,访问以下任何页面 都需要登陆
// 获取文件后缀名
var extName = url_str.slice(url_str.lastIndexOf(".") + 1);
// 一开始,通过req.url进行判定 并单独读取
// 后来发现只要是读取的文件那么与读取的文件路径就差一个.
// 强行读取文件
fs.readFile("." + url_str, function(err, data) {
// 判定 如果err是对象说明文件不存在
if(err) {
res.end("抱歉,读取的文件" + req.url + "不存在");
return;
}
// 如果出现乱码 那么要设置content-type响应头
res.setHeader("content-type", MIMEType[extName] + ";charset=utf-8");
// 如果代码能够执行到这里 说明有文件
// 返回给前端
res.end(data);
});
});
// 监听端口号
server.listen(3000);
node.js cookie
设置cookie
res.setHeader("set-cookie", ["key1=value1" , "key2=value2"]);
获取cookie
var cookie = req.headers.cookie;
var login_obj = qs.parse(cookie, ";");
举例:后端如何使用cookie的server.js
// 搭建服务器
var http = require("http");
// 读取文件
var fs = require("fs");
// 引入url
var url = require("url");
// 引入 querystring模块
var qs = require("querystring");
// 定义一个MIMEType类型对象
var MIMEType = {
"*" :"application/octet-stream",
"323" :"text/h323",
"acx" :"application/internet-property-stream",
"ai" :"application/postscript",
"aif" :"audio/x-aiff",
"aifc" :"audio/x-aiff",
"aiff" :"audio/x-aiff",
"asf" :"video/x-ms-asf",
"asr" :"video/x-ms-asf",
"asx" :"video/x-ms-asf",
"au" :"audio/basic",
"avi" :"video/x-msvideo",
"axs" :"application/olescript",
"bas" :"text/plain",
"bcpio" :"application/x-bcpio",
"bin" :"application/octet-stream",
"bmp" :"image/bmp",
"c" :"text/plain",
"cat" :"application/vnd.ms-pkiseccat",
"cdf" :"application/x-cdf",
"cer" :"application/x-x509-ca-cert",
"class" :"application/octet-stream",
"clp" :"application/x-msclip",
"cmx" :"image/x-cmx",
"cod" :"image/cis-cod",
"cpio" :"application/x-cpio",
"crd" :"application/x-mscardfile",
"crl" :"application/pkix-crl",
"crt" :"application/x-x509-ca-cert",
"csh" :"application/x-csh",
"css" :"text/css",
"dcr" :"application/x-director",
"der" :"application/x-x509-ca-cert",
"dir" :"application/x-director",
"dll" :"application/x-msdownload",
"dms" :"application/octet-stream",
"doc" :"application/msword",
"dot" :"application/msword",
"dvi" :"application/x-dvi",
"dxr" :"application/x-director",
"eps" :"application/postscript",
"etx" :"text/x-setext",
"evy" :"application/envoy",
"exe" :"application/octet-stream",
"fif" :"application/fractals",
"flr" :"x-world/x-vrml",
"gif" :"image/gif",
"gtar" :"application/x-gtar",
"gz" :"application/x-gzip",
"h" :"text/plain",
"hdf" :"application/x-hdf",
"hlp" :"application/winhlp",
"hqx" :"application/mac-binhex40",
"hta" :"application/hta",
"htc" :"text/x-component",
"htm" :"text/html",
"html" :"text/html",
"htt" :"text/webviewhtml",
"ico" :"image/x-icon",
"ief" :"image/ief",
"iii" :"application/x-iphone",
"ins" :"application/x-internet-signup",
"isp" :"application/x-internet-signup",
"jfif" :"image/pipeg",
"jpe" :"image/jpeg",
"jpeg" :"image/jpeg",
"jpg" :"image/jpeg",
"js" :"application/x-javascript",
"latex" :"application/x-latex",
"lha" :"application/octet-stream",
"lsf" :"video/x-la-asf",
"lsx" :"video/x-la-asf",
"lzh" :"application/octet-stream",
"m13" :"application/x-msmediaview",
"m14" :"application/x-msmediaview",
"m3u" :"audio/x-mpegurl",
"man" :"application/x-troff-man",
"mdb" :"application/x-msaccess",
"me" :"application/x-troff-me",
"mht" :"message/rfc822",
"mhtml" :"message/rfc822",
"mid" :"audio/mid",
"mny" :"application/x-msmoney",
"mov" :"video/quicktime",
"movie" :"video/x-sgi-movie",
"mp2" :"video/mpeg",
"mp3" :"audio/mpeg",
"mpa" :"video/mpeg",
"mpe" :"video/mpeg",
"mpeg" :"video/mpeg",
"mpg" :"video/mpeg",
"mpp" :"application/vnd.ms-project",
"mpv2" :"video/mpeg",
"ms" :"application/x-troff-ms",
"mvb" :"application/x-msmediaview",
"nws" :"message/rfc822",
"oda" :"application/oda",
"p10" :"application/pkcs10",
"p12" :"application/x-pkcs12",
"p7b" :"application/x-pkcs7-certificates",
"p7c" :"application/x-pkcs7-mime",
"p7m" :"application/x-pkcs7-mime",
"p7r" :"application/x-pkcs7-certreqresp",
"p7s" :"application/x-pkcs7-signature",
"pbm" :"image/x-portable-bitmap",
"pdf" :"application/pdf",
"pfx" :"application/x-pkcs12",
"pgm" :"image/x-portable-graymap",
"pko" :"application/ynd.ms-pkipko",
"pma" :"application/x-perfmon",
"pmc" :"application/x-perfmon",
"pml" :"application/x-perfmon",
"pmr" :"application/x-perfmon",
"pmw" :"application/x-perfmon",
"pnm" :"image/x-portable-anymap",
"pot" :"application/vnd.ms-powerpoint",
"ppm" :"image/x-portable-pixmap",
"pps" :"application/vnd.ms-powerpoint",
"ppt" :"application/vnd.ms-powerpoint",
"prf" :"application/pics-rules",
"ps" :"application/postscript",
"pub" :"application/x-mspublisher",
"qt" :"video/quicktime",
"ra" :"audio/x-pn-realaudio",
"ram" :"audio/x-pn-realaudio",
"ras" :"image/x-cmu-raster",
"rgb" :"image/x-rgb",
"rmi" :"audio/mid http://www.dreamdu.com",
"roff" :"application/x-troff",
"rtf" :"application/rtf",
"rtx" :"text/richtext",
"scd" :"application/x-msschedule",
"sct" :"text/scriptlet",
"setpay" :"application/set-payment-initiation",
"setreg" :"application/set-registration-initiation",
"sh" :"application/x-sh",
"shar" :"application/x-shar",
"sit" :"application/x-stuffit",
"snd" :"audio/basic",
"spc" :"application/x-pkcs7-certificates",
"spl" :"application/futuresplash",
"src" :"application/x-wais-source",
"sst" :"application/vnd.ms-pkicertstore",
"stl" :"application/vnd.ms-pkistl",
"stm" :"text/html",
"svg" :"image/svg+xml",
"sv4cpio" :"application/x-sv4cpio",
"sv4crc" :"application/x-sv4crc",
"swf" :"application/x-shockwave-flash",
"t" :"application/x-troff",
"tar" :"application/x-tar",
"tcl" :"application/x-tcl",
"tex" :"application/x-tex",
"texi" :"application/x-texinfo",
"texinfo" :"application/x-texinfo",
"tgz" :"application/x-compressed",
"tif" :"image/tiff",
"tiff" :"image/tiff",
"tr" :"application/x-troff",
"trm" :"application/x-msterminal",
"tsv" :"text/tab-separated-values",
"txt" :"text/plain",
"uls" :"text/iuls",
"ustar" :"application/x-ustar",
"vcf" :"text/x-vcard",
"vrml" :"x-world/x-vrml",
"wav" :"audio/x-wav",
"wcm" :"application/vnd.ms-works",
"wdb" :"application/vnd.ms-works",
"wks" :"application/vnd.ms-works",
"wmf" :"application/x-msmetafile",
"wps" :"application/vnd.ms-works",
"wri" :"application/x-mswrite",
"wrl" :"x-world/x-vrml",
"wrz" :"x-world/x-vrml",
"xaf" :"x-world/x-vrml",
"xbm" :"image/x-xbitmap",
"xla" :"application/vnd.ms-excel",
"xlc" :"application/vnd.ms-excel",
"xlm" :"application/vnd.ms-excel",
"xls" :"application/vnd.ms-excel",
"xlt" :"application/vnd.ms-excel",
"xlw" :"application/vnd.ms-excel",
"xof" :"x-world/x-vrml",
"xpm" :"image/x-xpixmap",
"xwd" :"image/x-xwindowdump",
"z" :"application/x-compress",
"zip" :"application/zip"
}
// 定义一个数组 当做临时的数据库
var db = [{username: "wanglaowu", password: "123"}];
// 调用方法创建服务器
var server = http.createServer(function(req, res) {
// 获取cookie
var cookie = req.headers.cookie;
// 定义用户姓名
var login_obj = qs.parse(cookie, ";");
var username = login_obj.username;
var password = login_obj.password;
var url_obj = url.parse(req.url);
var url_str = url_obj.pathname;
// 请求方式
var type = req.method.toLowerCase();
// 判定注册路由
if(url_str === "/regist" && type === "post") {
// 设定响应头
res.setHeader("content-type", "text/plain;charset=utf-8");
// 定义变量 负责接受数据
var str = "";
// 说明是post请求提交
req.on("data", function(data_chunk) {
str += data_chunk;
});
// 设定end事件
req.on("end", function() {
var query = decodeURIComponent(str);
var obj = qs.parse(query);
// console.log(obj);
for(var i = 0; i < db.length; i++) {
if(db[i].username === obj.username) {
// 说明有重复的了
res.end("抱歉,用户名已经被占用");
return;
}
}
// 说明没有重复的
db.push(obj);
// 将数据放入数组 并且提示用户 注册成功
res.end("恭喜,注册成功");
});
// 中止函数的执行
return;
}
// 判定登录路由
if(url_str === "/login" && type === "post") {
// 设置响应头
res.setHeader("content-type", "text/plain;charset=utf-8");
// 定义变量
var data = "";
// 获取前端提交过来的数据
req.on("data", function(data_chunk) {
data += data_chunk;
});
// 监听end事件
req.on("end", function() {
// console.log(data);
// 获取解码后的数据
var obj = qs.parse(decodeURIComponent(data));
// console.log(obj);
// 循环与数组中的每一条数据 比较
for(var i = 0; i < db.length; i++) {
if(db[i].username === obj.username && db[i].password === obj.password) {
// 说明登陆成功
// 返回信息给前端
fs.readFile("html/welcome.html", function(err, data) {
if(err) {
console.log("读取失败");
return;
}
// 将用户名和密码设置到cookie中去
res.setHeader("set-cookie", ["username=" + obj.username, "password=" + obj.password]);
// 设置响应内容编码和类型
res.setHeader("content-type", "text/html;charset=utf-8");
// 返回具体的响应内容
res.end(data);
})
return;
}
}
// 如果执行到这里 说明一条数据也没对上
res.end("抱歉 登录失败");
});
return;
}
// 设置welcome.html路由
if(url_str === "/html/welcome.html") {
// 判断必须要登陆
if(username) {
fs.readFile("html/welcome.html", function(err, data) {
res.setHeader("content-type", "text/html;charset=utf-8");
res.end(data);
});
return
} else {
res.setHeader("content-type", "text/plain;charset=utf-8");
// 没有登陆
res.end("不登录 不让看");
return;
}
}
// 此时,访问以下任何页面 都需要登陆
// 获取文件后缀名
var extName = url_str.slice(url_str.lastIndexOf(".") + 1);
// 一开始,通过req.url进行判定 并单独读取
// 后来发现只要是读取的文件那么与读取的文件路径就差一个.
// 强行读取文件
fs.readFile("." + url_str, function(err, data) {
// 判定 如果err是对象说明文件不存在
if(err) {
res.end("抱歉,读取的文件" + req.url + "不存在");
return;
}
// 如果出现乱码 那么要设置content-type响应头
res.setHeader("content-type", MIMEType[extName] + ";charset=utf-8");
// 如果代码能够执行到这里 说明有文件
// 返回给前端
res.end(data);
});
});
// 监听端口号
server.listen(3000);