node.js的特点
单线程 非堵塞I/O 事件驱动
node,js模块化
在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,data)
err:表示在读取过程中可能出现的异常 如果有异常发生 此时err是一个异常对象 如果没有异常发生 err是null
data:表示在读取成功的时候读到的内容 如果有异常发生 此时data为null 如果没有异常发生 data是读到的内容
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,data)
err:表示在读取过程中可能出现的异常 如果有异常发生 此时err是一个异常对象 如果没有异常发生 err是null
data:表示在读取成功的时候读到的内容 如果有异常发生 此时data为null 如果没有异常发生 data是读到的内容
// 当运行此文件时 要将同级目录下的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,data)
err:表示在读取过程中可能出现的异常 如果有异常发生 此时err是一个异常对象 如果没有异常发生 err是null
data:表示在读取成功的时候读到的内容 如果有异常发生 此时data为null 如果没有异常发生 data是读到的内容
// 创建目录 // 引入fs模块 var fs = require("fs"); // 调用对应的fs.mkdir fs.mkdir("html", function(err) { console.log(err); });
删除文件夹(只能删除空文件夹)
fs.rmdir(filePath,callback)
filePath:文件路径
callback(err,data)
err:表示在读取过程中可能出现的异常 如果有异常发生 此时err是一个异常对象 如果没有异常发生 err是null
data:表示在读取成功的时候读到的内容 如果有异常发生 此时data为null 如果没有异常发生 data是读到的内容
// 引入fs模块 var fs = require("fs"); // 调用rmdir fs.rmdir("html", function(err) { console.log(err); }); // 该方法只可以删除空目录
读取文件夹
fs.readdir(filePath,callback)
filePath:文件路径
callback(err,data)
err:表示在读取过程中可能出现的异常 如果有异常发生 此时err是一个异常对象 如果没有异常发生 err是null
data:表示在读取成功的时候读到的内容 如果有异常发生 此时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()); });
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);