Web 服务器介绍
Web 服务器一般指网站服务器, 是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。目前最主流的三个web服务器是 Apache Nginx IIs
Nodejs 创建一个Web服务器
const http = require('http')
const fs = require('fs')
const path = require('path')
const url = require('url')
http.createServer((req,res)=>{
res.writeHead(200,{"Content-Type":"text/html;charset='utf-8'"})
res.write("<head> <meta charset='UTF-8'></head>")
res.write('你好 nodejs')
let pathName = url.parse(req.url).pathname
console.log(pathName) // http://localhost:8081/news.html news.html
if(pathName !== '/favicon.ico'){ //过滤请求 favicon.ico
// 如果没传参数,默认加载index.html
pathName === '/' ? pathName = '/index.html' : pathName
//获取文件后缀名
let extName = path.extname(pathName)
fs.readFile('static/' + pathName,(err,data)=>{
if(err){
console.log(err)
fs.readFile('static/404.html',(error,result)=>{
//res.writeHead(200,{"Content-Type":`${getMime(fs,extName)};charset='utf-8'`})
//res.write("<head> <meta charset='UTF-8'></head>")
//res.write(result)
//res.end(result)
})
return
}
res.write(data)
})
}
res.end()
}).listen(8081)
// 获取后缀名的方法
// 注意异步执行
let getMime = (fs,extname)=>{
fs.readFile('./mime.json',(err,data)=>{
if(err){
console.log('mime.json文件不存在')
return false
}
console.log(data.toString())
let Mimes = JSON.parse(data.toString())
return Mimes[extname] || 'text/html'
})
// 把读取数据改成同步
let data = fs.readFileSync('./mime.json')
let Mimes = JSON.parse(data.toString())
return Mimes[extname] ||'text/html'
//switch(extname){
// case '.html':
// return 'text/html'
// case '.css':
// return 'text/css'
// case '.js':
// return 'text/javascript'
// default:
// return 'text/html'
//}
}
Nodejs的非阻塞 I/O、异步·、事件驱动
- Nodejs 的单线程 非阻塞I/O事件驱动
- Nodejs 回调处理异步
- Nodejs events 模块处理异步
Nodejs 的单线程 非阻塞I/O事件驱动
在 java、php 或者 .net 等服务器端语言中,会为每个客户端连接创建一个新的线程。每个线程需要耗费大约 **2MB ** 内存。也就是说,理论上,一个 8GB 内存的服务器可以同时连接的最大用户数为 4000 个左右。要让 Web 应用程序支持更多的用户·,就需要增加服务器的数量,而 Web 应用程序的硬件成本当然就上升了
Node.js 不为每个客户连接创建一个新的线程,而仅仅使用一个线程。当有用户连接了,就触发一个内部事件,通过非阻塞I/O、事件驱动机制,让 Node.js 程序宏观上也是并行的。使用 Node.js ,一个8GB内存的服务器,可以同时处理超过4万用户的连接。
非阻塞I/O
const fs = require('fs')
console.log('1')
fs.readFile('./mime.json',(err,data)=>{
console.log(data)
console.log('2')
})
console.log('3')
// 132
Nodejs 回调处理异步
// 回调函数解决
const fs = require('fs')
let getMimes = (callback)=>{
fs.readFile('./mime.json',(err,data)=>{
if(err){
console.log(err)
return
}
callback(data)
})
}
getMimes((data)=>{
//操作
})
Nodejs events 模块处理异步
-
Node.js 有很多内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件
-
Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高
-
Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发
//引入 events 模块
const events = require('events')
//实例化 EventEmitter 类
let EventEmitter = new events.EventEmitter()
/** 广播和接收广播 */
// 监听 to_parent 的广播
EventEmitter.on('to_parent',(data)=>{
console.log('接收到了这个广播事件')
console.log(data)
})
setTimeout(()=>{
console.log('开始广播')
// 广播 to_parent 事件
EventEmitter.emit('to_parent','发送的数据')
},2000)
/** 应用 */
const fs = require('fs')
const events = require('events')
const EventEmitter = new events.EventEmitter()
let getMime = ()=>{
fs.readFile('./mime.json',(err,data)=>{
if(err){
console.log(err)
}
// 广播数据
EventEmitter.emit('data',data)
})
}
getMime()
// 监听广播数据
EventEmitter.on('data',(mime)=>{
console.log(mime.toString())
})
NodeJs WEB 服务器 静态文件托管、路由、EJS模板引擎、GET、POST
- Nodejs 静态路由托管
- 路由
- 初识 EJS 模块引擎
- GET、POST
Nodejs 静态路由托管
//router.js --> 静态 web 服务器封装
const fs = require('fs')
const url = require('url')
const path = require('path')
exports.statics = (req,res,staticPath)=>{
// 自己完成,冲冲冲
}
路由
路由(Routing)是由一个URL(路径)和一个特定的HTTP方法(GET、POST等)组成的,涉及到应用如何响应客户端对某个网站节点的访问
简单来说: 路由就是指针对不同请求的URL,处理不同的业务逻辑
const http = require('http')
const url = require('url')
http.createServer((req,res)=>{
let pathName = url.parse(req.url).pathname
if(pathName === '/login'){
res.end('login')
}else if(pathName === '/order'){
res.end('order')
}else{
res.end('index')
}
}).listen(8081)
初识 EJS 模板引擎
这里的EJS是后台模板,可以把我们数据库和文件读取的数据显示到html页面上。它是一个第三方模块,需要通过npm安装 https://www.npmjs.com/package/ejs
npm install ejs --save
const http = require('http')
const url = require('url')
const ejs = require('ejs')
http.createServer((req,res)=>{
res.writeHead(200,{"Content-Type":"text/html;charset=utf-8"})
let pathName = url.parse(req.url).pathname
if(pathName === '/login'){
let data = '我是后台数据'
let list = [1,2,3,4,5]
let h = '<h2>这是一个h2</h2>'
//按数据库的数据渲染到模板上面
ejs.renderFile('views/login.ejs',{
msg:data,
list:list,
h:h
},(err,data)=>{
res.end(data)
})
res.end('login')
}else if(pathName === '/order'){
res.end('order')
}else{
res.end('index')
}
}).listen(8081)
//views/login.ejs
<h2><%=msg%></h2>
<ul>
<% for(let i = 0; i < list.length; i++){ %>
<li><%= list[i] %></li>
<% } %>
</ul>
<%- h %>
EJS常用标签
- <% %> 流程控制标签
- <%= %> 输出标签(原文输出HTML标签)
- <%- %> 输出标签(HTML会被浏览器解析)
- <%# %> 注释标签
- % 对标记进行转义
- -%> 去掉没用的空格
GET、POST
超文本传输协议(HTTP)的设计目的是保证客户端机器与服务器之间的通讯。在客户端和服务器之间进行请求-响应时,两种最常被用到的方法是:GET和POST
- GET - 从指定的资源请求数据。(一般用于获取数据)
- POST - 向指定的资源提交要被处理的数据。(一般用于提交数据)
<%#form.ejs%>
<h2>登录</h2>
<form avtion='/dologin' method='post'>
用户名:<input type="text" name="username" /><br/>
密码:<input type="password" name="password" /><br/>
<input type='submit' value="登录">
</form>
//查看是get还是post
req.method --> GET / POST
//get 获取数据
url.parse(req.url,true).query
//post 获取数据
req.method.toLowerCase() --> post
let str = ''
req.on('data',(chunk)=>{
str += chunk
})
req.on('end',(err,chunk)=>{
//res.end(str)
fs.appendFile('login.txt',str+'\n',(err)=>{
if(err){
console.log(err)
return
}
console.log("保存成功")
})
res.end("<script>alert('登录成功');history.back()</script>")
})
END
网友评论