本文主要用于记录node.js基础知识,主要内容为 菜鸟教程学习,以WIM平台下的 Node.js v4.4.3 LTS为例。
文章名:node.js学习笔记
作者:遮瑕注意本文只适用于想只学习基础的朋友,请希望系统学习的朋友不要使用本文。
一、认识node.js
(一)什么是node.js
简单来说,node.js就是运行在服务器端的JavaScript。JavaScript是一种具有函数优先的轻量级、解释的编程语言,它是一个知名的开发Web页面的脚本语言。
node.js基于 Google 的 V8 引擎运行(V8 引擎执行 Javascript 的速度非常快)。
我们可以通过node.js快速的进行服务器开发。
(二)怎么安装node.js
Node.js 安装包及源码下载地址为:https://nodejs.org/zh-cn/download/。
Node.js 历史版本下载地址为:https://nodejs.org/dist/。
直接安装完成就好,对win来说,安装包(.msi)版本就是常用的安装包安装的形式,二进制(.exe)版本不用安装,可以直接运行。
(三)node.js使用
1.node.js运行
node.js运行有两种方式,一种是采用Node.js REPL(交互式解释器),一种是通过node直接运行node.js。
(1)Node.js REPL(交互式解释器)
Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境,类似 Windows 系统的终端或 Unix/Linux shell,我们可以在终端中输入命令,并接收系统的响应。其可以执行以下操作:
读取 - 读取用户输入,解析输入的 Javascript 数据结构并存储在内存中。
执行 - 执行输入的数据结构
打印 - 输出结果
循环 - 循环操作以上步骤直到用户两次按下 ctrl-c 按钮退出。
1.启动REPL
在cmd窗口输入命令
node
即可开启REPL窗口。
2.简单的表达式
我们可以直接输入+
、-
、*
、/
进行运算
>1+4
5
>5 / 2
2.5
3.变量定义
变量可以使用var定义,或者直接变量名 = 10
,var定义后不会输出,没用使用var的话会进行一次输出。同时可以使用console.log()来输出变量。
>x = 10
10
>var y = 10
undefined
console.log(x)
10
undefined
console.log("Hello World")
Hello World
undefined
4.多行表达式
REPL会自动识别需要多行的表达式,例如:
var x = 0
undefined
> do {
... x++;
... console.log("x: " + x);
... } while ( x < 5 );
x: 1
x: 2
x: 3
x: 4
x: 5
undefined
>
其中的三点“...”是它自动生成的。
5.下划线(_)变量
可以用下划线表示上一个表达式的值,实现快速调用。
> var x = 10
undefined
> var y = 20
undefined
> x + y
30
> var sum = _
undefined
> console.log(sum)
30
undefined
>
6.REPL命令
ctrl + c - 退出当前终端。
ctrl + c 按下两次 - 退出 Node REPL。
ctrl + d - 退出 Node REPL.
向上/向下 键 - 查看输入的历史命令
tab 键 - 列出当前命令
.help - 列出使用命令
.break - 退出多行表达式
.clear - 退出多行表达式
.save filename - 保存当前的 Node REPL 会话到指定文件
.load filename - 载入当前 Node REPL 会话的文件内容。
(2)cmd窗口直接运行node.js文件
我们也可以先写一个node.js程序文件,然后通过node.js去执行它,例如在指定文件夹位置输入:
node server.js
通过node去执行当前目录下的server.js文件。
2.node.js包管理器(NPM)
NPM作用主要为:
- 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
- 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
- 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
具体使用请需要时再去查看,不必过多关注。
二、node.js快速实现服务器
(一)建立本机服务器
只能本机访问自己跑的服务器
在使用node.js时,我们不是用它在服务器上实现了一个应用,而是在实现应用的同时,实现了整个http服务器。一般使用node.js实现应用主要分为以下三步:
- 引入 required 模块:我们可以使用 require 指令来载入 Node.js 模块。
- 创建服务器:服务器可以监听客户端的请求,类似于 Apache 、Nginx 等 HTTP 服务器。
- 接收请求与响应请求:服务器很容易创建,客户端可以使用浏览器或终端发送 HTTP 请求,服务器接收请求后返回响应数据。
简单来说,我们可以使用以下的程序来实现一个可以输出“Hello World”的服务器:
//使用 require 指令来载入 http 模块,并将实例化的 HTTP 赋值给变量 the_http var the_http = require('http'); //使用 http.createServer() 方法创建服务器 the_http.createServer(function (request, response) { // 发送 HTTP 头部 // HTTP 状态值: 200 : OK // 内容类型: text/plain response.writeHead(200, {'Content-Type':'text/plain;charset=UTF-8'}); // 发送响应数据 "Hello World" response.end('Hello World\n'); }).listen(8888,'127.0.0.1'); //使用 listen 方法绑定 8888 端口以及127.0.0.1地址 //我们对以上的程序进行拆分:the_http.createServer(服务器应用函数).listen(8888,'127.0.0.1'); //其中,服务器应用函数:function(request, response){B} //其中,服务器应用函数内部:response.writeHead(); response.end(); // 终端打印如下信息 console.log('Server running at http://127.0.0.1:8888/');
以上程序基本原理为:
- 第一行请求(require)Node.js 自带的 http 模块,并且把它赋值给 http 变量。
- 接下来我们调用 http 模块提供的函数createServer。这个函数会返回 一个对象,这个对象有一个叫做 listen 的方法,这个方法有一个数值参数, 指定这个 HTTP 服务器监听的端口号。
需要注意的是,在这里我们只能使用127.0.0.1等主机环回地址
,地址为环回地址的任何数据包都不应该离开计算机(主机),发送它的数据不是被发送到本地网络或互联网,它只是被自己“环回”,并且发送数据包的计算机成为接收者。
(二)让内网可以访问服务器
和跑服务器的设备在一个局域网的设备都可以访问这个服务器
我们可以采用如下步骤实现:
1.将服务器设备连接到局域网,查询到它的IP(命令行界面输入ipconfig)
2.我们服务器程序的IP修改为我们刚刚查询到的IP
3.访问设备在网址栏输入刚刚设置的IP,成功实现内网访问
注意:连接到局域网的IP如果设置的自动分配的话,是会改变的,最好设置为手动输入,定死一个IP,确保程序可以正常运行。
三、node.js服务器的实际使用
(一)网页与服务器数据交互
网页页面和服务器数据交互的主要思路为:
1、利用nodejs搭建服务器,监听客户端的请求,根据URL的不同响应不同的页面。
2、响应的数据来自于node.js对文件系统的访问。
3、采用POST请求提交表单。
大体如下图所示:
1.node.js输出html页面
既然要实现数据交互,那我们首先需要实现可以通过服务器向设备提供html页面。代码如下,主要使用到http模块
进行网络通信;使用fs模块
获取服务器内html页面数据;使用response.write()
发送读取到的html数据,让浏览器以html的格式进行解释,在response.end()
之前,response.write()可以被执行多次。
var the_http = require('http'); //使用 require 指令来载入 http 模块,并将实例化的 HTTP 赋值给变量 the_http var sendhtml=require('fs'); //使用 require 指令来载入 fs 模块,并将实例化的 fs 赋值给变量 sendhtml //fs(file system) 模块是nodejs提供的用于访问本地文件系统的功能模块,它使得运行于nodejs环境下的JavaScript具备直接读写本地文件的能力。 var server = the_http.createServer(); var ser = server.listen(6500,'192.168.3.202'); var htmlfile_addr = __dirname; //__dirname表示当前文件所在的目录,例如__dirname/file.txt代表当前目录内的file.txt文件的绝对地址 var htmlfile = htmlfile_addr + '/index.html' //创建一个HTTP sever对象,监听端口 server.on('request',function(req,res) { console.log("有请求"); sendData(htmlfile,req,res); //定义一个函数来发送页面 function sendData(file,req,res) { sendhtml.readFile(file,function(err,data) { if(err) { res.writeHead(404,'err',{'content-type':'text/html;charset=utf-8'}); res.write("出错了"); res.end(); }else { res.writeHead(200,{'content-type':'text/html;charset=utf-8'}); //发送html页面的head res.write(data); //输出读取到的文件数据,也就是html页面本体 res.end(); } }); }; });
2.html与服务器的信息传输
上文完成了HTML页面的显示,但是我们还需要实现数据的交互,及HTML页面可以发送数据到node.js处。在这里,为了接收和解析前端发送来的数据,我们需要使用到url模块
。
这里只考虑最简易的方法,及前端通过访问不同url路径直接对服务器数据进行修改。
var http = require('http'); var url = require('url'); http.createServer(function(req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); var params = url.parse(req.url, true).query; // 解析 url 参数 res.write("网站名:" + params.name); res.write("\n"); res.write("网站 URL:" + params.url); res.end(); }).listen(3000);
访问方式如下:http://127.0.0.1:3000/?name=1&url=123
,以上url解析出来后,params.name为1,params.url为123。
(二)服务器数据库SQLite
作为服务器而言,显然还需要满足数据存储的功能,我们选择使用SQLite作为数据库,因为其本体极小,适合使用在低性能嵌入式系统上。SQLite最大的特点就是没有任何数据库服务器,无论是C、java、node.js,只需要相应的驱动,就可以直接对数据库进行读写。在这里我们当然选择node.js进行SQLite的读写,node.js提供了较多的模块,我们选择使用sqlite3模块
。
本段简单描述如何使用node.js的sqlite3模块进行SQLite相关操作。大概如下,以后有需要再进行学习。
var fs = require('fs');
//数据库文件的路径
var dbfile = 'D:\SQLite\Hello_SQLite.db';
//同步检查给定路径中是否已存在文件,根据检查结果返回一个布尔值
var exists = fs.existsSync(dbfile);
//sqlite3.verbose() - 设置执行模式为输出调用堆栈
var sqlite3 = require('sqlite3').verbose();
//返回数据库对象并且自动打开和连接数据库
var the_db = new sqlite3.Database(dbfile,function () {
//增
var sql1 = the_db.prepare("insert into Hello values('hello,world')");
sql1.run();
console.log(sql1);//可以这样检查
});
//增
var sql1 = db.prepare("insert into 表名 values (内容,跟mysql一样)");
sql1.run();
//console.log(sql1);//可以这样检查
//删
var sql2 = db.prepare("delete from 表名 where id = 1");
//console.log(sql2);
sql2.run();
//改
var sql3 = db.prepare("update 表名 set name = winston where id = 1");
sql3.run();
//查
//查一个表的所有数据
db.all("select * from 表名",function(err,row){
console.log(JSON.stringify(row));
})
//查一条数据
db().each("select * from 表名",function(err,row){
console.log(row);
})