zoukankan      html  css  js  c++  java
  • 留言板(Nodejs)

    一、知识点

    ①nodejs实际开发中,通常把所有的HTML文件放到views目录中

    ②nodejs实际开发中,通常把所有的静态资源文件放到public目录中,方便统一处理

    • 当浏览器收到HTML响应内容之后,会从上到下依次解析,解析过程中当发现link、script、img、iframe、video、audio等带有src或者href(link)属性标签的时候,会自动对这些资源发起新的请求,这些资源就是静态资源
    • 把所有的静态资源放到统一的目录中,可以灵活的控制文件是否能被用户访问
    • 但是需要注意的是,客户端里的请求路径需要改成   /public/xxx   的形式,其中 /  就是url的根路径

    ③表单提交的数据处理需要使用nodejs的url模块,其中url.parse(‘地址’,true)可以将路径解析成为一个方便操作的对象

    var url=require('url');
    
    var path='/say?name=乔峰&message=降龙十八掌';
    
    var obj=url.parse(path,true);
    
    console.log(obj);
    console.log(obj.pathname);
    console.log(obj.query);

    ④通过服务器让客户端重定位,需要两个步骤,第一个是状态码(statusCode)设置为302(302是临时重定向,浏览器没有记忆功能),第二个是在响应头(setHeader)中通过Location重定向

    二、功能实现

    ①项目目录

    ②HTML文件

    • index.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>留言板</title>
        <link rel="stylesheet" href="/public/lib/bootstrap/dist/css/bootstrap.css">
    </head>
    <body>
        <div class="header container">
            <div class="page-header">
                <h1>留言板 <small>留言列表</small></h1>
                <a class="btn btn-success" href="/post">发表留言</a>
            </div>
        </div>
        <div class="comments container">
            <ul class="list-group">
                {{each comments}}
                <li class="list-group-item">
                    {{$value.name}}说:  {{$value.message}} 
                    <span class="pull-right">{{$value.datetime}}</span>
                </li>
                {{/each}}
            </ul>
        </div>
    </body>
    </html>
    • post.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>留言板</title>
        <link rel="stylesheet" href="/public/lib/bootstrap/dist/css/bootstrap.css">
    </head>
    <body>
        <div class="header container">
            <div class="page-header">
                <h1><a href="/" >留言板 <small>添加留言</small></a></h1>
            </div>
        </div>
        <div class="comments container">
            <form action="/say" method="GET">
                <div class="form-group">
                    <label for="name">你的大名</label>
                    <input type="text" id="name" name="name" class="form-control" placeholder="请输入姓名" required minlength="2" maxlength="10">
                </div>
                <div class="form-group">
                    <label for="message">留言内容</label>
                    <textarea id="message" name="message" class="form-control" placeholder="请输入留言内容" cols='30' rows='10' required minlength="5" maxlength="20"></textarea>
                </div>
                <button type="submit" class="btn btn-default">发表</button>
            </form>
        </div>
    </body>
    </html>
    • 404.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>404</title>
    </head>
    <body>
        <h1>抱歉,您访问的页面失联了....</h1>
    </body>
    </html>

    ③app.js文件

    //加载模块
    var http=require('http');
    var fs=require('fs');
    var url=require('url');
    var temlate=require('art-template');
    // 模拟首页留言列表数据
    var comments=[
        {name:"赵一",message:"你用什么编辑器?",datetime:"2018-1-1"},
        {name:"孙二",message:"今天天气真好",datetime:"2018-1-1"},
        {name:"张三",message:"飞流直下三千只",datetime:"2018-1-1"},
        {name:"李四",message:"哈哈哈哈哈",datetime:"2018-1-1"},
        {name:"王五",message:"楼上是傻逼",datetime:"2018-1-1"}
    ]
    //创建web服务
    var server=http.createServer();
    server.on('request',function(request,response){
        /* var url=request.url; 把路径解析成一个对象*/
        var parseObj=url.parse(request.url,true);
        var pathname=parseObj.pathname;
        //请求路径不同,返回不同的数据
        if(pathname==='/'){
            // 请求路径是根目录,即请求留言列表页
            fs.readFile('./views/index.html',function(err,data){
                if(err){
                    return response.end('404 Not Found');
                }
                var htmlStr=temlate.render(data.toString(),{
                    comments:comments
                });
                response.end(htmlStr);
            });
        }else if(pathname==='/post'){
            //请求路径是 /post 即跳转至添加留言页面
            fs.readFile('./views/post.html',function(err,data){
                if(err){
                    return response.end('404 Not Found')
                }
                response.end(data);
            });
        }else if(pathname.indexOf('/public/')===0){
            //请求路径是以 /public/ 开头,即请求静态资源的文件
            fs.readFile('.'+pathname,function(err,data){
                if(err){
                    return response.end('404 Not Found');
                }
                response.end(data);
            });
        }else if(pathname==='/say'){
            //请求路径是 /say 即表单提交
            var comment=parseObj.query;
            comment.datetime='2018-2-10';
            comments.unshift(comment);
            //重定向,跳转回首页
            response.statusCode=302;
            response.setHeader('Location','/');
            response.end();
        } else{
            //请求路径为其他都设置404
            fs.readFile('./views/404.html',function(err,data){
                if(err){
                    return response.end('404 Not Found');
                }
                response.end(data);
            });
        }
    });
    //创建监听对象
    server.listen(3000,function(){
        console.log('Server is running...')
    })

    ④效果演示

  • 相关阅读:
    小米手机导出微信聊天记录
    IBM X3650 M4 微码升级(BIOS升级)
    leetcode1987 不同的好子序列数目
    leetcode1932 合并多棵二叉搜索树
    leetcode146 LRU 缓存机制
    leetcode456 132 模式
    leetcode316 去除重复字母
    GIT放弃本地所有修改,强制拉取更新
    vendor/easywechat-composer/easywechat-composer/src:
    微信公众号推广饿了么赏金红包制作
  • 原文地址:https://www.cnblogs.com/EricZLin/p/9286904.html
Copyright © 2011-2022 走看看