Nodejs WEB服务器 静态文件托管、 GET POST路由 EJS模板引擎(8)

1 Nodejs 静态文件托管   

2、 路由

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

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

  非官方解释:路由指的就是针对不同请求的 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 +‘\n‘,function (err) {
                if (err){
                    console.log(err);
                }
                console.log(‘写入文件成功‘);
            })

        })
    }else{
        res.end(‘other‘)
    }
}).listen(8001);

原文地址:https://www.cnblogs.com/angle6-liu/p/11740628.html

时间: 2025-01-05 05:31:21

Nodejs WEB服务器 静态文件托管、 GET POST路由 EJS模板引擎(8)的相关文章

nodejs之静态文件托管、 路 由、EJS 模板引擎、GET、POST

1.静态文件托管 静态文件托管:是指对于一个js方法进行封装,提高代码可读性 //fs模块 var fs=require('fs'); //path模块 var path=require('path'); /*nodejs自带的模块*/ //url模块 var url=require('url'); //获取文件类型的方法 私有 function getMime(extname,callback){ /*获取后缀名的方法*/ fs.readFile('./mime.json',function(

web服务器php-fpm文件分析

php-fpm目前主要又两个分支,分别对应于php-5.2.x的版本和php-5.3.x的版本.在5.2.x的版本中,php-fpm.conf使用的是xml格式,而在新的5.3.x版本中,则是和php.ini一样的配置风格. 1.php-FPM 提供了慢执行日志,可以将执行比较慢的脚本的调用过程 dump 到日志中.PHP 5.3.3 之前设置如下: <value name="request_slowlog_timeout">5s</value> <val

Android与Asp.Net Web服务器的文件上传下载BUG汇总【更新】

遇到的问题: 1.java.io.IOException: open failed: EINVAL (Invalid argument)异常,在模拟器中的sd卡创建文件夹和文件时报错 出错原因可能是:(1)文件名称中含有不符合规范的字符,比如“:”,“?”或者空格等.(2)需要先创建文件夹目录再创建文件,不能直接创建文件. 2. android.os.NetworkOnMainThreadException异常,从服务器请求数据后,写入文件时报错 出错原因:在主线程内执行了访问http的操作,最

LAMP+NFS实现多个web服务器静态资源统一存储

需求分析: 1.前端需支持更大的访问量,单台Web服务器已无法满足需求了,则需扩容Web服务器: 2.虽然动态内容可交由后端的PHP服务器执行,但静态页面还需要Web服务器自己解析,那是否意味着多台Web服务器都需要在各自的系统中都存有一份静态页面数据呢? 其实这样也不是不可以,毕竟文件本地访问,速度还是有优势的,但这却涉及到多台Web服务器间内容的一致性问题,这种问题也不可避免: 那么如果能将静态页面集中存放,所有Web服务器都来集中地取文件,对于文件的一致性就有了保障,这个集中地就叫做"文件

基于C# Socket的Web服务器---静态资源处理

Web服务器是Web资源的宿主,它需要处理用户端浏览器的请求,并指定对应的Web资源返回给用户,这些资源不仅包括HTML文件,JS脚本,JPG图片等,还包括由软件生成的动态内容.为了满足上述需求,一个完整的Web服务器工作流程: 1)   服务器获得浏览器通过TCP/IP连接向服务器发送的http请求数据包. 2)   HTTP请求经过Web服务器的HTTP解析引擎分析得出请求方法.资源地址等信息,然后开始处理. 3)   对于静态请求,则在服务器上查询请求url路径下文件,并返回(如果未找到则

TCP/IP协议学习(四) 基于C# Socket的Web服务器---静态资源处理

目录 1. C# Socket通讯 2. HTTP 解析引擎 3. 资源读取和返回 4. 服务器测试和代码下载 Web服务器是Web资源的宿主,它需要处理用户端浏览器的请求,并指定对应的Web资源返回给用户,这些资源不仅包括HTML文件,JS脚本,JPG图片等,还包括由软件生成的动态内容.为了满足上述需求,一个完整的Web服务器工作流程: 1) 服务器获得浏览器通过TCP/IP连接向服务器发送的http请求数据包. 2) HTTP请求经过Web服务器的HTTP解析引擎分析得出请求方法.资源地址等

[js高手之路]node js系列课程-创建简易web服务器与文件读写

web服务器至少有以下几个特点: 1.24小时不停止的工作,也就是说这个进程要常驻在内存中 2.24小时在某一端口监听,如: http://localhost:8080, www服务器默认端口80 3.要能够处理基本的请求:如get, post 在node js中创建一台服务器非常的简单,因为node自带http模块,该模块可以帮助我们非常快速搭建一台web服务器,来处理一个简单的请求. 1 const http = require("http"); 2 var server = ht

Web服务器实现文件传输程序设计

总体概括来说就是设计一个Web服务器的流程,将执行流程分为简单的步骤,每个步骤作为一个模块来实现. 1.整体设计 服务器程序发送文件给客户端或者从客户端接收文件,每次通信只能做一次文件传输,传输完毕后准备处理下一次通信.客户端程序,接收或者发送一个文件后就可以退出.因此,服务器短程序是一个死循环,处理一次之后不退出,继续监听.客户端程序处理一个连接就可以了. 2.客户端程序设计 客户端程序主要任务有3个, (1)分析用户输入的命令 (2)根据命令向服务器端发出请求 (3)等待服务器返回请求的结果

3 ~ express ~ 静态文件托管

静态资源文件处理 (一)设置静态资源托管目录 /* *  当 用户访问的 url 以 /public 开始 ,那么直接返回对应 __dirname + '/public' 下的文件  . 注意是双下划线 __ */ app.use('/public',express.static(__dirname+'/public')) (二)流程: 1,用户发送 http 请求  => url  =>  解析路由  => 找到匹配的规则  => 执行相应函数  => 返回指定内容给用户