node.js web编程总结--web项目demo

目的

建立简单的node.js的demo项目,实现前后端分离的例子

  1. 有简单的页面跳转功能

  2. 有静态文件管理功能

  3. 密码登录一般都是放到后端服务器,通过ngnix做请求转发即可,页面通过ajax做异步请求。

  4. jx打包项目,运行项目

  5. springboot搭建简单的后台restful服务

源代码

git@gitee.com:kaiyang_taichi/nodejs.git

前提

已搭建好node.js、npm、cnpm环境

实现

[root@10 apps]# cd apps
[root@10 apps]# mkdir web
[root@10 apps]# cd web
[root@10 web]# mkdir public
//初始化ppackage.json管理依赖
[root@10 web]# cnpm --yes init
[root@10 web]# cnpm install express
[root@10 node_modules]# cnpm install http-proxy
  1. 将静态资源css、js、images放入public目录下
  2. 编写主服务js:server.js
var express      = require('express');
var app          = express();
//指定静态文件路径
app.use(express.static('public'));
var http = require('http'), 
httpProxy = require('http-proxy');  
    
  // 新建一个代理 Proxy Server 对象  
  var proxy = httpProxy.createProxyServer({});  
    
  // 捕获异常  
  proxy.on('error', function (err, req, res) {  
        res.writeHead(500, {  
            'Content-Type': 'text/plain'  
        });  
       res.end('Something went wrong. And we are reporting acustom error message.');  
 });  

app.all('/*.do', function(req, res) {   
  //对于.do的请求,直接去请求后台数据,此处可以通过一些框架实现mock和生产代理的配置,实现代理,
   proxy.web(req, res, { target: 'http://localhost:1111' });  
})

app.all('/*.html', function(req, res) {  
 console.log("请求"+req.path); 
res.sendFile( __dirname + req.path);
})

app.all('/', function(req, res) {  
 console.log("请求"+req.path); 
res.sendFile( __dirname + '/login.html');
})
     
var server = app.listen(8081, function () {
 
  var host = server.address().address
  var port = server.address().port
 
  console.log("应用实例,访问地址为 http://%s:%s", host, port)
 
})
  1. 登录首页,表单提交请求.do
<!DOCTYPE HTML>
<html>
<head>
    <title>Purple_loginform Website Template | Home :: w3layouts</title>
    <link href="css/style.css" rel="stylesheet" type="text/css" media="all" />
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <!-- -->
    <script>var __links = document.querySelectorAll('a');function __linkClick(e) { parent.window.postMessage(this.href, '*');} ;for (var i = 0, l = __links.length; i < l; i++) {if ( __links[i].getAttribute('data-t') == '_blank' ) { __links[i].addEventListener('click', __linkClick, false);}}</script>
    <script src="js/jquery.min.js"></script>
    <script>

  


        $(document).ready(function(c) {


        var message=getQueryString('message')
        if(message){
            $('#message').html(message);
        }else{
             $('#message').html('');
        }

        function getUrlVars()  
            {  
                var vars = [], hash;  
                var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');  
                for(var i = 0; i < hashes.length; i++)  
                {  
                    hash = hashes[i].split('=');  
                    vars.push(hash[0]);  
                    vars[hash[0]] = hash[1];  
                }  
                return vars;  
            }  

        function getQueryString(name) { 
              var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); 
              var r = window.location.search.substr(1).match(reg); 
              if (r != null) return decodeURI(r[2]); return null; 
        }



         $("#form").submit(function(e){
               $.ajax({
                  type: 'POST',
                //请求后台服务
                  url: '/demo/hello.do',
                  data:$("#form").serialize(),
                  dataType: 'json',
                  success: function(res) {
                    if(res.code=='1'){
                        window.location.replace('/index.html');
                    }else{
                         window.location.replace('/login.html?message='+res.message);
                    }
                 }

                });


         });
    });

 

    </script>
</head>
<body>
<!-- contact-form -->
<div class="message warning">
    <div class="inset">
        <div class="login-head">
            <h1>用户管理系统</h1>
            <div class="alert-close"> </div>
        </div>
        <form  method="post" id="form">

            <li>
                <input type="text" class="text"  placeholder="请输入登录名" name="loginName" value="" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = '';}"><a href="#" class=" icon user"></a>
            </li>
            <div class="clear"> </div>
            <li>
                <input type="password" value=""   placeholder="请输入密码" name="password" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = '';}"> <a href="#" class="icon lock"></a>
            </li>
            <span style="color: red" id="message"></span>


            <div class="clear"> </div>
            <div class="submit">
                <input type="submit"  name="submit"  onclient style="float:right">
                <div class="clear">  </div>
            </div>

        </form>
    </div>
</div>
</div>
<div class="clear"> </div>
<!--- footer --->
<div class="footer">
</div>

</body>
</html>
  1. 启动springboot项目,作为后台服务
    用idea编译springboot项目,生成jar包,将其复制到服务器上,启动服务
//后台启动web项目
[root@10 web1]# java -jar demo-0.0.1-SNAPSHOT.jar > log.log 2>&1 &
  1. 启动node.js项目
node server.js >log.log 2>&1 &

6.查看效果

效果展示

7.jx打包项目

[root@10 web]# jx package server.js demo
//杀掉原服务,重启
[root@10 web]# jx demo.jx >log.file 2>&1 &
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • 坑是你自己挖的,也是你心甘情愿往下跳的,可到了最后你会发现你不仅爬不出去,而且里面只有你一个人。果然,想得太多会让...
    小辣焦阅读 208评论 0 1
  • 邀一根羽毛 让它在阳光下风干 携一抹轻纱 在聚光灯下为你轻舞 点一抹蜡烛 泛泛灯光照在片片素笺上 磨一盘油墨 在素...
    沫小鱼阅读 409评论 1 2