http模块
创建服务器基本步骤
//1. 导入http模块,http模块是node的核心模块,作用是用来创建http服务器的。 var http = require("http"); //2. 创建服务器 var server = http.createServer(); //3. 服务器处理请求 server.on("request", function() { console.log("我接收到请求了"); }); //4. 启动服务器,监听某个端口 server.listen(9999, function(){ console.log("服务器启动成功了, 请访问: http://localhost:9999"); });
详细说明
-
给服务器注册request事件,只要服务器接收到了客户端的请求,就会触发request事件
-
request事件有两个参数,request表示请求对象,可以获取所有与请求相关的信息,response是响应对象,可以获取所有与响应相关的信息。
-
服务器监听的端口范围为:1-65535之间,推荐使用3000以上的端口,因为3000以下的端口一般留给系统使用
request对象详解
文档地址:http://nodejs.cn/api/http.html#http_message_headers
常见属性:
headers: 所有的请求头信息 method: 请求的方式 rawHeaders: 所有的请求头信息(数组的方式) url: 请求的地址
注意:在发送请求的时候,可能会出现两次请求的情况,这是因为谷歌浏览器会自动增加一个favicon.ico
的请求。
小结:request对象中,常用的就是method和url两个参数
response对象详解
文档地址:http://nodejs.cn/api/http.html#http_class_http_serverresponse
常见的属性和方法:
res.write(data): 给浏览器发送请求体,可以调用多次,从而提供连续的请求体 res.end(); 通知服务器,所有响应头和响应主体都已被发送,即服务器将其视为已完成。 res.end(data); 结束请求,并且响应一段内容,相当于res.write(data) + res.end() res.statusCode: 响应的的状态码 200 404 500 res.statusMessage: 响应的状态信息, OK Not Found ,会根据statusCode自动设置。 res.setHeader(name, value); 设置响应头信息, 比如content-type res.writeHead(statusCode, statusMessage, options); 设置响应头,同时可以设置状态码和状态信息。
注意:必须先设置响应头,才能设置响应。
根据不同请求输出不同响应数据
-
req.url
:获取请求路径-
例如:请求
http://127.0.0.1:3000/index
获取到的是:/index
-
例如:请求
http://127.0.0.1:3000/
获取到的是:/
-
例如:请求
http://127.0.0.1:3000
获取到的是:/
-
服务器响应文件
-
注意:浏览器中输入的URL地址,仅仅是一个标识,不与服务器中的目录一致。也就是说:返回什么内容是由服务端的逻辑决定
server.on('request', function(req, res) { var url = req.url if(url === '/') { fs.readFile('./index.html', function(err, data) { if(err) { return res.end('您访问的资源不存在~') } res.end(data) }) } })
模拟Apache服务器
-
根据
req.url
读取不同的页面内容,返回给浏览器
MIME类型
-
MIME(Multipurpose Internet Mail Extensions)多用途Internet邮件扩展类型 是一种表示文档性质和格式的标准化方式
-
浏览器通常使用MIME类型(而不是文件扩展名)来确定如何处理文档;因此服务器将正确的MIME类型附加到响应对象的头部是非常重要的
mime模块
-
作用:获取文件的MIME类型
-
安装:
npm i mime
var mime = require('mime') // 获取路径对应的MIME类型 mime.getType('txt') // ⇨ 'text/plain' // 根据MIME获取到文件后缀名 mime.getExtension('text/plain') // ⇨ 'txt'
路由
路由(route):就是一套映射规则,根据url地址分配到对应的处理程序
art-template 模板引擎
-
安装
npm install art-template
-
核心方法
// 基于模板路径渲染模板 //参数1:文件的路径 //参数2:数据 //返回值:返回渲染后的内容 // template(filename, data) let html = template(path.join(__dirname, "pages", "index.html"), {name:"大吉大利,今晚吃鸡"});
注意点:文件的路径必须是绝对路径
hacknews 数据处理
-
采用
后端渲染
将模板页面和数据渲染为用户能够看懂的正常页面返回
url模块
-
说明:用于 URL 处理与解析
-
注意:通过url拿到的查询参数都是字符串格式
// 导入url模块 var url = require('url') // 解析 URL 字符串并返回一个 URL 对象 // 第一个参数:表示要解析的URL字符串 // 第二个参数:是否将query属性(查询参数)解析为一个对象,如果为:true,则query是一个对象 var ret = url.parse('http://localhost:3000/details?id=1&name=jack', true) console.log(ret.query) // { id: '1', name: 'jack' }
querystring模块
-
用于解析与格式化 URL 查询字符串
-
注意:只在专门处理查询字符串时使用
// foo=bar&abc=xyz&abc=123 var querystring = require('querystring') // 将查询参数转化为对象 // 第一个参数: 要解析的 URL 查询字符串 querystring.parse('foo=bar&abc=xyz') // { foo: 'bar', abc: 'xyz' }
服务端重定向
-
说明:服务端可以通过HTTP状态码让浏览器中的页面重定向
res.writeHead(302, { 'Location': '/' }) res.end()
POST请求参数的处理
-
说明:POST请求可以发送大量数据,没有大小限制
// 接受POST参数 var postData = [] // 给req注册一个data事件, 只要浏览器给服务器发送post请求,data事件就会触发 // post请求发送的数据量可以很大, 这个data事件会触发多次,一块一块的传输 // 要把所有的chunk都拼接起来 // data事件:用来接受客户端发送过来的POST请求数据 var result = ""; req.on('data', function (chunk) { result += chunk; }) // end事件:当POST数据接收完毕时,触发 req.on('end', function () { cosnole.log(result); })