node学习3

2020-07-29  本文已影响0人  kevin5979

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、异步·、事件驱动

  1. Nodejs 的单线程 非阻塞I/O事件驱动
  2. Nodejs 回调处理异步
  3. 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 模块处理异步
//引入 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 静态路由托管

//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
上一篇下一篇

猜你喜欢

热点阅读