美文网首页
node学习3

node学习3

作者: kevin5979 | 来源:发表于2020-07-29 10:41 被阅读0次

    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 模块处理异步
    • 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

    相关文章

      网友评论

          本文标题:node学习3

          本文链接:https://www.haomeiwen.com/subject/nqvjcktx.html