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

Posted 柳帅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nodejs WEB服务器 静态文件托管 GET POST路由 EJS模板引擎相关的知识,希望对你有一定的参考价值。

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 +\'\\n\',function (err) {
                if (err){
                    console.log(err);
                }
                console.log(\'写入文件成功\');
            })

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

 

以上是关于Nodejs WEB服务器 静态文件托管 GET POST路由 EJS模板引擎的主要内容,如果未能解决你的问题,请参考以下文章

如何在 firebase 托管中托管单页 webapp 的静态文件,并将 web API 部署在不同的服务器中

nodejs 构建本地web测试服务器 以及 解决访问静态资源的问题!

nodejs azure web app给出http 431错误

nodejs实现静态托管

[Nodejs] node实现静态文件服务器

nodejs 搭建简易服务器