Node JS简介

简单的说 Node.js 就是运行在服务端的 JavaScript。Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。
我自己也是初学者而且学得不深只是简单了解一下,我是看小马的视频学习的,你们有兴趣的话可以去看一下,这是他的视频地址http://komavideo.com/。这里是我学的时候的笔记。如果有什么疑惑的地方也请谅解,我也不太懂😁

1.Node JS的安装

1
2
3
4
5
官方网站:
https://nodejs.org/ 下载LTS版本是最稳定的

node -v 查看版本
npm -v 查看npm版本

2.线程模型和事件循环

线程模型

Apache+Tomcat(6,7,8,9)运行

  1. req来袭
  2. thread应对
  3. req处理完后,thread释放

线程处理模式就是重复以上三个步骤,来处理来自客户端的各种请求,当有大量客户端的请求来袭时,服务器消耗的资源也会随之增加。

事件循环

Node.js服务运行

  1. 开一个事件等待循环(event-loop)
  2. req来袭
  3. 放入事件处理队列中,然后继续等待新的req请求
  4. req处理完成后,调用I/O,结束req(非阻塞调用)

事件循环处理模式中,线程不用等待req处理完后在进行下个req的处理,而是将所有的req请求放入到队列之中,然后采用非同步的方式,等待req处理完后再调用I/O资源,然后结束req。

3.从Hello World 开始 Node JS的使用

1
2
3
4
5
6
7
//Hello World.js
console.log("Hello World");
var mystr="Hello World.js";
console.log(mystr);

//cmd
node Hello World.js

4.阻塞和非阻塞处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 阻塞处理
function updb1() {
var start = new Date().getTime();
while (new Date().getTime() < start + 3000);
}
updb1();
//数据库更新完毕
console.log("updb1 success.");
console.log("I like javascript.");

// 非阻塞处理
function updb2(done) {
setTimeout(() => {
done();
}, 3000);
}
updb2(function () {
//数据库更新完毕
console.log("updb2 success.");
});
console.log("I like Nodejs.");

5.使用Node JS做一个简单的Web服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello Node.js World.\n');
});

server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});

6.设定指定的IP地址端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//config.js
const config = {
hostname: '127.0.0.1',
port: '3000'
};

exports.config = config;

//myserver.js
const http = require('http');
const config = require('./config').config;

const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
});

server.listen(config.port, config.hostname, () => {
console.log(`Server running at http://${config.hostname}:${config.port}/`);
});

7.返回指定的URL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//req.url:返回客户端请求的url地址
const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');

switch (req.url) {
case '/':
res.end('helo world.');
break;
case '/about':
res.end('This is about page.');
break;
case '/home':
res.end('Welcome to my homepage!');
break;
default:
res.end('NotFound!');
}
});

server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});

8.fs文件读写模块的引用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//index.html
<html>
<body>
<h1>Helo index.html!</h1>
</body>
</html>

//myserver.js
const http = require('http');
const fs = require('fs');

const server = http.createServer((req, res) => {
fs.readFile(__dirname + '/index.html', 'utf-8', function (err, data) {
if (err) {
res.setHeader('Content-Type', 'text/plain');
res.statusCode = 404;
res.end('Not Founded.');
} else {
res.setHeader('Content-Type', 'text/html');
res.statusCode = 200;
res.end(data);
}
});
});

const hostname = '127.0.0.1';
const port = 3000;
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});

9.ejs的安装和使用

1
2
//安装
npm install ejs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//hello.ejs
<html>
<title><%= title %></title>
<body>
<%- content %>
</body>
</html>

//myserver.js
const http = require('http');
const fs = require('fs');
const ejs = require('ejs');
var template = fs.readFileSync(__dirname + '/hello.ejs', 'utf-8');
const server = http.createServer((req, res) => {
var data = ejs.render(template, {
title: 'helo ejs',
content: '<strong>big helo ejs.</strong>'
});
res.setHeader('Content-Type', 'text/html');
res.statusCode = 200;
res.end(data);
});

const hostname = '127.0.0.1';
const port = 3000;
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});

10.简单的表单例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!-- form.ejs -->
<!DOCTYPE html>
<html lang="zh-cmn-Hans">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>小论坛</title>
</head>
<body>
<form action="" method="post">
<input type="text" name="content" id="content">
<input type="submit" value="提交">
<ul>
<% for(var i = 0; i < posts.length; i++) { %>
<li><%= posts[i] %></li>
<% } %>
</ul>
</form>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
//myserver.js
//这是最基础的版本 现在应该不会这么写了,但是我就是理解一下而已,没有去深究。
const http = require('http');
const fs = require('fs');
const ejs = require('ejs');
const qs = require('querystring'); //+读取数据的模块

var template = fs.readFileSync(__dirname + '/form.ejs', 'utf-8');
var posts = []; //+

const server = http.createServer((req, res) => {
if (req.method === 'POST') {
//表单提交
req.data = "";
req.on("readable", function () {
//表单数据收集
var chr = req.read();
if (chr)
req.data += chr;
});
req.on("end", function () {
//表单处理
var query = qs.parse(req.data);
posts.push(query.content);
showForm(posts, res);
});
} else {
//表单显示
showForm(posts, res);
}
});

const hostname = '127.0.0.1';
const port = 3000;
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});

function showForm(p_posts, res) {
var data = ejs.render(template, {
title: 'helo ejs',
posts: p_posts
});
res.setHeader('Content-Type', 'text/html');
res.statusCode = 200;
res.end(data);
}

11.Node JS的回调地狱

回调地狱

Node.js是非阻塞编程,那么在编码过程中会遇到很多的回调函数(Callback),如果多个处理的回调函数嵌套在一起的话,就会形成回调地狱,虽然对于程序的结果没有任何影响,但对于程序代码的可读性来说就是个地狱。

1
2
3
4
5
6
7
8
9
10
11
12
13
//回调地狱
function dbupd(sql, done) {
setTimeout(() => done(sql + " upd ok."), 800);
}
dbupd("1.sql1", result => {
console.log(result);
dbupd("2.sql2", result => {
console.log(result);
dbupd("3.sql3", result => {
console.log(result);
});
});
});

Promise解决

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Promise函数嵌套解决方法
function dbupAsync(sql) {
const p = new Promise((resolve, reject) => {
setTimeout(() => {
console.log(sql + " upd ok.");
resolve(sql + ".ok");
}, 800)
});
return p;
}
dbupAsync("2.sql1")
.then(() => dbupAsync("2.sql2"))
.then(() => dbupAsync("3.sql3"));

// 代码更加简洁的async/await
async function upAllDB() {
const result1 = await dbupAsync("3.sql1");
const result2 = await dbupAsync("3.sql2");
const result3 = await dbupAsync("3.sql3");
console.log(result1, result2, result3);
}
upAllDB();

总结

最基础的Node JS入门,知道它是什么东西和怎么操作,hhh,我感觉好像也学不多东西,但是有去努力就会有收获,后面要开始Vue的学习,那个会重点学习,加油少年!!