zoukankan      html  css  js  c++  java
  • Nodejs WEB服务器 静态文件托管、 GET POST路由 EJS模板引擎(8)

    Nodejs 静态文件托管   

    2、 路由

      官方解释:路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP 方法(GETPOST 等)组成的,

    涉及到应用如何响应客户端对某个网站节点的访问。

      非官方解释:路由指的就是针对不同请求的 URL, 处理不同的业务逻辑。 

    3 路由静态文件提取

    原 `services.js` 代码

    // 引入模块
    var http = require('http');
    
    // fs 模块
    var fs =require('fs');
    
    // path模块
    var path = require('path');
    
    // url 模块
    var url = require('url');
    
    // 自定义模块
    var mimeModel =require('./model/getmimefromfile.js');
    
    http.createServer(function (req, res) {
        //http://localhost:8001/news.html  /news.html
        //http://localhost:8001/index.html  /index.html
        //css/dmb.bottom.css
    
        // 只获取路径,不携带参数
        var pathname =url.parse(req.url).pathname;
        //路由分发
        if (pathname==='/'){
            pathname ='/index.html';
        }
    
        // 获取后缀名
        var extname = path.extname(pathname);
    
        if (pathname!=='/favicon.ico'){ /*过滤请求 favicon.ico*/
            //console.log(pathname);
            //文件操作获取 static 目录下的 index.html  文件
            fs.readFile('static'+pathname,function (err, data) {
                if (err){
                    console.log('404');
                    fs.readFile('static/404.html',function (err, data404) {
                        if (err){
                            console.log(err);
                        }
                        res.writeHead('404',{"Content-Type":"text/html;charset='utf-8'"});
                        res.write(data404);
                        res.end()
                    })
                }else{//返回文件
                    // 获取文件类型
                    var mine = mimeModel.getMine(fs,extname);
                    res.writeHead(200,{"Content-Type":mine+";charset='utf-8'"});
                    res.write(data);
                    res.end()
                }
            })
        }
        console.log(pathname);
    }).listen(8001);

    提取出 `router.js `文件

    // fs 模块
    var fs =require('fs');
    
    // path模块
    var path = require('path');
    
    // url 模块
    var url = require('url');
    
    // 私有方法 getMine
    = function (fs, extname) { //.html var data = fs.readFileSync('./mime.json'); var Mimes = JSON.parse(data.toString()); return Mimes[extname] || 'text/html'; }; exports.statics= function (req,res,staticpath) { // 只获取路径,不携带参数 var pathname =url.parse(req.url).pathname; //路由分发 if (pathname==='/'){ pathname ='/index.html'; } // 获取后缀名 var extname = path.extname(pathname); if (pathname!=='/favicon.ico'){ /*过滤请求 favicon.ico*/ //console.log(pathname); //文件操作获取 static 目录下的 index.html 文件 fs.readFile(staticpath+'/'+pathname,function (err, data) { if (err){ console.log('404'); fs.readFile(staticpath+'/404.html',function (err, data404) { if (err){ console.log(err); } res.writeHead('404',{"Content-Type":"text/html;charset='utf-8'"}); res.write(data404); res.end() }) }else{//返回文件 // 获取文件类型 var mine = getMine(fs,extname); res.writeHead(200,{"Content-Type":mine+";charset='utf-8'"}); res.write(data); res.end() } }) } console.log(pathname); }

    目录结构

    路由分发逻辑演示

    `services2.js`

    //引入http模块
    var http=require('http');
    
    var url=require('url');
    //路由:指的就是针对不同请求的 URL,处理不同的业务逻辑。
    http.createServer(function(req,res){
    
    
        var pathname=url.parse(req.url).pathname;
    
        if(pathname=='/login'){
    
            res.end('login');
    
        }else if(pathname=='/register'){
    
            res.end('register');
        }else if(pathname=='/order'){
    
            res.end('order');
    
    
        }else{
    
            res.end('index');
        }
    
    }).listen(8001);

    4 初始 EJS模板引擎

    官网 : https://www.npmjs.com/package/ejs

    安装:

    npm install ejs –save / cnpm install ejs --save

    EJS 常用标签
    <% %>流程控制标签
    <%= %>输出标签(原文输出 HTML 标签)
    <%- %>输出标签(HTML 会被浏览器解析)

    nodejs 中使用

    ejs.renderFile(filename, data, options, function(err, str){
    // str => Rendered HTML string
    });

    渲染实例

    `02services2.js`

    //引入http模块
    var http=require('http');
    
    var url=require('url');
    
    var ejs=require('ejs');
    
    //路由:指的就是针对不同请求的 URL,处理不同的业务逻辑。
    
    http.createServer(function (req,res) {
        res.writeHead(200,{"Content-Type":"text/html;charset='utf-8'"});
    
        var pathname = url.parse(req.url).pathname;
        console.log(pathname);
        if (pathname ==="/login"){
            var data ='你好我是后台数据';
    
            var list = ['111','222','333'];
    
            var rawHtml = '<h2>我是原生的h2标签</h2>';
            // 把数据渲染到模板上面
            ejs.renderFile('views/login.ejs',
                {
                    msg:data,
                    list:list,
                    raw:rawHtml
                },
                function (err,data) {
                console.log('1');
                res.end(data)
            })
        }
    
    }).listen(8001);

    `views/login.ejs`

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        <h2>这是一个ejs 后台模板引擎 -- 登录</h2>
        <h2><%=msg%></h2>
        <br>
        <hr>
        <ul>
            <!-- for 循环渲染数组 -->
            <% for (var i = 0; i < list.length; i++) { %>
                <li><%=list[i]%></li>
            <%}%>
        </ul>
    
        <!--    渲染 标签 字符串-->
        <%-raw%>
    
    </body>
    </html>

    5 get 和 post

    //引入http模块
    var http=require('http');
    
    var url=require('url');
    
    var ejs=require('ejs');
    
    var fs=require('fs');
    
    //路由:指的就是针对不同请求的 URL,处理不同的业务逻辑。
    http.createServer(function(req,res){
        res.writeHead(200,{"Content-Type":"text/html;charset='utf-8'"});
    
        //获取get 还是post请求
        var method=req.method.toLowerCase();
        //console.log(method);
        var pathname=url.parse(req.url,true).pathname;
    
        if(pathname==='/login'){  /*显示登录页面*/
    
    
            ejs.renderFile('views/form.ejs',{
    
            },function(err,data){
                res.end(data);
            })}else if(pathname==='/dologin' &&method==='get'){
            //get获取数据
            console.log(url.parse(req.url,true).query);
            res.end('dologin');
        }else if(pathname==='/dologin' &&method==='post'){
            //post获取数据
            var postStr ='';
            req.on('data',function (chunk) {
                postStr +=chunk;
            });
    
            req.on('end',function (err,chunk) {
                console.log(postStr);
                fs.appendFile('login.txt',postStr +'
    ',function (err) {
                    if (err){
                        console.log(err);
                    }
                    console.log('写入文件成功');
                })
    
            })
        }else{
            res.end('other')
        }
    }).listen(8001);
  • 相关阅读:
    DeprecationWarning:'open()' is deprecated in mongoose>=4.11.0,use 'openUri()' instead or set the 'useMongoClient' option if using 'connect()' or 'createConnection'
    javascript if else优化指南
    前端上传文件的几种方式
    前端图片优化
    微信小程序中利用时间选择器和js无计算实现定时器(将字符串或秒数转换成倒计时)
    javascript之闭包理解以及应用场景
    网页或微信小程序中使元素占满整个屏幕高度
    微信小程序定时器组件(输入时间字符串即可倒计时)
    自己用js实现全屏滚动
    js获取屏幕宽高
  • 原文地址:https://www.cnblogs.com/angle6-liu/p/11740628.html
Copyright © 2011-2022 走看看