初步了解Node.js,学做简单的留言本案例
在还没有正式的学Node.js的时候, 你们认为Node.js 对于前端来说是什么呢?
会认为Node.js 是框架? 认为这是类似Jquery的一个快速、简洁的JavaScript框架? 反正我自己起初是这么认为的,因为它后面有个 .js。
那么在正式开始接触Node.js的时候,才发现自己是有多么愚蠢。在进入了Node.js的官网后,看完对Node的介绍一后才发现 Node 和 Js 都好猛啊。
官方对Node.js就简单的一句话:(Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.) Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时。
在看完这个介绍的时候反正起初是懵逼的,因为我压根不了解 什么叫 基于 Chrome V8 引擎的 JavaScript 运行时,然后我关顾各个大佬的博客来看看大佬们对Node.js的理解后,初步在自己头脑有了对Node.js有了大概的概念。 Node.js就是一款工具 一个基于 Chrome V8 引擎的 在 服务端 运行JavaScript代码的工具。 说白了就是 为了给JavaScript 在服务端运行提供了一个环境。
了解完Node.js后,就开始在网上找了个教学视频简单的学习下Node.js并且做了个简单的留言本案例
app.js (这个 js 脚本是在服务端运行的 和 浏览器的 js 不同 没有DOM BOM)
 var http = require('http')
 var fs = require('fs')
 var template = require('art-template')
 var url = require('url')
 // silly-datetime 模块 可以获取当前时间
 var time = require('silly-datetime')
 var comments =[
     {
         name: '张三',
         message: '今天天气不错!',
         dateTime: '2015-10-16 22:17'
     },
     {
         name: '李四',
         message: '今天天气不错!',
         dateTime: '2015-10-16 18:30'
     },
     {
         name: '王二',
         message: '今天天气不错!',
         dateTime: '2015-10-16 15:12'
     },
     {
         name: '陈臣',
         message: '今天天气不错!',
         dateTime: '2015-10-16 10:31'
     },
     {
         name: '二狗',
         message: '今天天气不错!',
         dateTime: '2015-10-16 8:42'
     }
 ]
 // 对于我们来讲,其实只需要判定,如果你的请求路径是 /pinglun 的时候,那我就认为你提交表单的请求过来了
 http.createServer(function(req,res) {
     // 使用 url.parse 方法将路径解析为一个方便操作的对象,第二个参数为 true 表示直接将查询字符串转为一个对象(通过 query 属性来访问)
     var parseObj = url.parse(req.url, true)
     // 单独获取不包含查询字符串的路径部分(该路径不包含 ? 之后的内容)
     var pathname = parseObj.pathname
     if( pathname === '/') {
         fs.readFile('./views/index.html', function(err,data) {
             if(err) {
                 return res.end('404 Not Found')
             }else {
                 var htmlStr = template.render(data.toString(),{
                     comments:comments
                 })
                 res.end(htmlStr)
             }
         })
     // /public 整个 public 目录中的资源都允许被访问
     // .indexOf()方法      检测 请求地址url中 有没有是 /public 开头的 ===0    如果有执行里面的代码
     // 例如:     请求路径是: http://127.0.0.1:3000/public/......
     }else if(pathname === '/post') {
         fs.readFile('./views/post.html', function(err,data) {
             if(err) {
                 return res.end('404 Not Found')
             }else {
                 res.end(data)
             }
         })
     }else if(pathname.indexOf('/public/') === 0) {
         // /public/css/main.css
         // /public/js/main.js
         // /public/lib/jquery.js
         // 统一处理:
         //    如果请求路径是以 /public/ 开头的,则我认为你要获取 public 中的某个资源
         //    所以我们就直接可以把请求路径当作文件路径来直接进行读取
         fs.readFile('.' + pathname, function(err,data) {
             if(err) {
                 return res.end('404 Not Found')
             }else {
                 res.end(data)
             }
         })
     }else if(pathname === '/pinglun') {
             //    1. 获取表单提交的数据 parseObj.query
             //    2. 将当前时间日期添加到数据对象中,然后存储到数组中
             //    3. 让用户重定向跳转到首页 /
             //       当用户重新请求 / 的时候,我数组中的数据已经发生变化了,所以用户看到的页面也就变了
             var comment = parseObj.query
             // 获取当前时间
             comment.dateTime = time.format(new Date(), 'YYYY-MM-DD HH:mm')
             // .push()方法 追加到数组的末尾    .unshift()方法追加到数组的开头
             comments.unshift(comment)
             // comments.push(comment)
             // 服务端这个时候已经把数据存储好了,接下来就是让用户重新请求 / 首页,就可以看到最新的留言内容了
             // 如何通过服务器让客户端重定向?
             //    1. 状态码设置为 302 临时重定向
             //        statusCode
             //    2. 在响应头中通过 Location 告诉客户端往哪儿重定向
             //        setHeader
             // 如果客户端发现收到服务器的响应的状态码是 302 就会自动去响应头中找 Location ,然后对该地址发起新的请求
             // 所以你就能看到客户端自动跳转了
             res.statusCode = 302
             // 就去请求路径是 / 的页面
             res.setHeader('Location', '/')
             res.end()
     }
     else {
         // 其它的都处理成 404 找不到
         fs.readFile('./views/404.html', function(err,data) {
             if(err) {
                 return res.end('404 Not Found')
             }else {
                 res.end(data)
             }
         })
     }
 })
 .listen(3000, function() {
     console.log('服务器启动成功了,可以通过 http://127.0.0.1:3000/ 来进行访问');
 })
index.html页面是留言本案例的首页(当点击发布留言会跳转post.html页面中)
<!DOCTYPE html>
<!-- saved from url=(0027)http://192.168.150.76:3000/ -->
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>留言本</title>
<link rel="stylesheet" href="/public/lib/bootstrap/bootstrap.css">
<link rel="stylesheet" type="text/css"
href="chrome-extension://fidicgekecdkdmkjghdgadgdmcfodfid/themes/default/content.css">
</head>
<body>
<!-- <img src="/public/img/ab3.jpg" style="width:189px; height:126px"> -->
<div class="header container">
<div class="page-header">
<h1>Example page header <small>Subtext for header</small></h1>
<!-- <a class="btn btn-success" href="http://192.168.150.76:3000/post">发表留言</a> -->
<a class="btn btn-success" href="/post">发表留言</a>
</div>
</div>
<div class="comments container">
<ul class="list-group">
<!-- <li class="list-group-item">1</li>-->
<!-- 模板引擎 -->
{{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>Document</title>
<link rel="stylesheet" href="/public/lib/bootstrap/bootstrap.css">
</head>
<body>
<div class="header container">
<div class="page-header">
<h1><a href="/">首页</a> <small>发表评论</small></h1>
</div>
</div>
<div class="comments container">
<form action="/pinglun" method="get">
<div class="form-group">
<label for="input_name">你的大名</label>
<input type="text" class="form-control" required minlength="2" maxlength="10" id="input_name" name="name"
placeholder="请写入你的姓名">
</div>
<div class="form-group">
<label for="textarea_message">留言内容</label>
<textarea class="form-control" name="message" id="textarea_message" 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>404 您访问的页面失联啦...</h1>
</body>
</html>
使用电脑的 cmd(命令提示符)启动 app.js(此时就相当于开启了一个web服务器)

通过 http://127.0.0.1:3000/ 或者填写本机的ip地址 在浏览器访问 就可以看到 index.html页面

点击发布留言后会跳转到 post.html中

点击发表后会自动跳转到index.html页面并且留言内容会更新

这就是整个留言本案例的基本功能,我也是跟着别人的教学一步步做的感觉功能基本实现了,就差数据库来保存数据了,但通过这个案例基本对Node.js就会有更深的认识了。
2019-12-01 12:40:34
初步了解Node.js,学做简单的留言本案例的更多相关文章
- [NodeJS]使用Node.js写一个简单的在线聊天室
		
声明:教程来自<Node即学即用>.源代码案例均出自此书.博文仅为个人学习笔记. 第一步:创建一个聊天server. 首先,我们先来写一个Server: var net = require ...
 - Node.js能够做什么?
		
正如 JavaScript 为client而生.Node.js 为网络而生.Node.js 能做的远不止开发一个网 站那么简单,使用 Node.js,你能够轻松地开发:  具有复杂逻辑的站点:  ...
 - 我为什么选择采用node.js来做新一代的EasyDarwin RTSP开源流媒体服务器
		
在去年我们还未开始开发基于node.js的新版本EasyDarwin RTSP开源流媒体服务器的时候,我写了一篇博客<对EasyDarwin开源项目后续发展的思考:站在巨人的肩膀上再跳上另一个更 ...
 - 手把手教你学node.js之一个简单的express应用
		
一个简单的express应用 目标 建立一个 lesson1 项目,在其中编写代码.当在浏览器中访问 http://localhost:3000/ 时,输出 Hello World. 挑战 访问 ht ...
 - 学习用node.js建立一个简单的web服务器
		
一.建立简单的Web服务器涉及到Node.js的一些基本知识点: 1.请求模块 在Node.js中,系统提供了许多有用的模块(当然你也可以用JavaScript编写自己的模块,以后的章节我们将详细讲解 ...
 - 用node.js写一个简单爬虫,并将数据导出为 excel 文件
		
引子 最近折腾node,最开始像无头苍蝇一样到处找资料,然而多数没什么卵用,都在瞎比比.在一阵瞎搞后,我来分享一下初步学习node的三个过程: 1 撸一遍NODE入门,对其有个基本的了解: 2 撸一遍 ...
 - 初步揭秘node.js中的事件
		
当你学习node.js的时候,Events是一个非常重要的需要理解的事情.非常多的Node对象触发事件,你能在文档API中找到很多例子.但是关于如何写自己的事件和监听,你可能还不太清楚.如果你不了解, ...
 - Node.js可以做些什么?
		
就像 JavaScript 至client天生,Node.js 生于网络.Node.js 我们可以做更多的不是开发一个网络 站这么简单,采用 Node.js.您可以轻松地开发:  具有复杂逻辑的站点 ...
 - 使用Node.js快速搭建简单的静态文件服务器
		
做前端有时会采用一些复杂框架,在文件系统中直接打开页面(用file:///方式打开),往往会报跨域的错,类似于“XMLHttpRequest cannot load ...(文件名). Cross o ...
 
随机推荐
- luogu P1807 最长路_NOI导刊2010提高(07)
			
题目描述 设G为有n个顶点的有向无环图,G中各顶点的编号为1到n,且当为G中的一条边时有i < j.设w(i,j)为边的长度,请设计算法,计算图G中<1,n>间的最长路径. 输入格式 ...
 - kubernetes学习笔记(一)——minikube安装记录
			
想学习一下kubernetes,于是先安装一个单机版来学习一下.但是就是这个最简单的单机版安装方式都倒腾了我好久,记录下自己的安装过程.博主是在windows利用vmware workstation安 ...
 - Nginx的事件循环
			
首先事件循环的起点就是监听端口获取连接,我们可以在ngx_event_core_module模块的ngx_event_process_init函数中看到如下的代码: /* for each liste ...
 - 探究 Nginx 中 reload 流程的真相
			
今天这篇文章主要来介绍下 Nginx 的 reload 流程.实际上在之前文章中,在更改了 nginx 配置文件时,我们都会执行 nginx -s reload 命令,我们执行这条命令的原因是希望 n ...
 - art-template循环无法显示出数据
			
art-template循环遍历无法显示数据原因 1.语法问题:循环语句导致的问题 2.插件问题: 用标准语法时循环数据如果引入第一个插件,会导致数据显示不出来只有引入第二个插件才可循环出数据 用原生 ...
 - 【Vuejs】335-(超全) Vue 项目性能优化实践指南
			
点击上方"前端自习课"关注,学习起来~ 前言 Vue 框架通过数据双向绑定和虚拟 DOM 技术,帮我们处理了前端开发中最脏最累的 DOM 操作部分, 我们不再需要去考虑如何操作 D ...
 - Java题整
			
Java面试题整 http://www.cnblogs.com/remember-forget/p/6140166.html 上:http://blog.csdn.net/jackfrued/arti ...
 - 关于eclipse码代码时光标自动消失要重新点击输入框的问题
			
前几天码代码时在两个电脑都出现了同样的问题,就是在输入的时候,输入法突然从程序框切换到某不可名状的位置,要重新点击输入框才能解决.(后发现不但是eclipse,任何带有输入框的都会出现此问题) 经排查 ...
 - 更新Preloader和uboot
			
在SoCEDS环境下编译和更新preloader和uboot程序的方法 前面有介绍preloader在HPS boot过程中的的作用,接下来讲述下用户在SoCEDS环境下改如何编译preloade ...
 - 关于maven依赖关系的问题
			
maven可以非常方便的管理jar包依赖问题. 这几天遇到的问题是:使用maven在idea跑flink程序提示 java.lang.ClassNotFoundExceptionjava.lang.N ...