一、Node.js 工具模块
序号 | 模块名 | 描述 |
---|---|---|
1 | OS 模块 | 提供基本的系统操作函数。 |
2 | Path 模块 | 提供了处理和转换文件路径的工具。 |
3 | Net 模块 | 用于底层的网络通信。提供了服务端和客户端的的操作。 |
4 | DNS 模块 | 用于解析域名。 |
5 | Domain 模块 | 简化异步代码的异常处理,可以捕捉处理try catch无法捕捉的。 |
更多详情见:菜鸟教程:https://www.runoob.com/nodejs/nodejs-utitlity-module.html
二、Node.js Web 模块
1. Web 应用架构
-
Client - 客户端,一般指浏览器,浏览器可以通过 HTTP 协议向服务器请求数据。
-
Server - 服务端,一般指 Web 服务器,可以接收客户端请求,并向客户端发送响应数据。
-
Business - 业务层, 通过 Web 服务器处理应用程序,如与数据库交互,逻辑运算,调用外部程序等。
-
Data - 数据层,一般由数据库组成。
2. 使用 Node 创建 Web 服务器 和 Web 客户端
Node.js 提供了 http 模块,http 模块主要用于搭建 HTTP 服务端和客户端,使用 HTTP 服务器或客户端功能必须调用 http 模块,代码如下:
var http = require('http');
具体示例见:菜鸟教程:https://www.runoob.com/nodejs/nodejs-web-module.html
三、Node.js Express 框架
1. Express 框架核心特性:
-
可以设置中间件来响应 HTTP 请求。
-
定义了路由表用于执行不同的 HTTP 请求动作。
-
可以通过向模板传递参数来动态渲染 HTML 页面。
2. 安装 Express:
$ cnpm install express --save
以下几个重要的模块是需要与 express 框架一起安装的:
-
body-parser - node.js 中间件,用于处理 JSON, Raw, Text 和 URL 编码的数据。
-
cookie-parser - 这就是一个解析Cookie的工具。通过req.cookies可以取到传过来的cookie,并把它们转成对象。
-
multer - node.js 中间件,用于处理 enctype="multipart/form-data"(设置表单的MIME编码)的表单数据。
3. 第一个 Express 框架实例
在浏览器中访问 http://127.0.0.1:8081时,页面会呈现 Hello World 。
//express_demo.js 文件
var express = require('express');
var app = express();
app.get('/', function (req, res) {
res.send('Hello World');
})
var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})
4. 其他
-
请求和响应
-
路由
-
静态文件
-
GET 方法
-
POST 方法
-
文件上传
-
Cookie 管理
更多详情见:菜鸟教程:https://www.runoob.com/nodejs/nodejs-express-framework.html
四、Node.js RESTful API
REST即表述性状态传递(英文:Representational State Transfer,简称REST)是一种软件架构风格。
表述性状态转移是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful。需要注意的是,REST是设计风格而不是标准。REST通常基于使用HTTP,URI,和XML(标准通用标记语言下的一个子集)以及HTML(标准通用标记语言下的一个应用)这些现有的广泛流行的协议和标准。REST 通常使用 JSON 数据格式。
HTTP 方法:以下为 REST 基本架构的四个方法:
-
GET - 用于获取数据。
-
PUT - 用于更新或添加数据。
-
DELETE - 用于删除数据。
-
POST - 用于添加数据。
创建 RESTful:
首先,创建一个 json 数据资源文件 users.json,内容如下:
{
"user1" : {
"name" : "mahesh",
"password" : "password1",
"profession" : "teacher",
"id": 1
},
"user2" : {
"name" : "suresh",
"password" : "password2",
"profession" : "librarian",
"id": 2
},
"user3" : {
"name" : "ramesh",
"password" : "password3",
"profession" : "clerk",
"id": 3
}
}
基于以上数据,我们创建以下 RESTful API:
序号 | URI | HTTP 方法 | 发送内容 | 结果 |
---|---|---|---|---|
1 | listUsers | GET | 空 | 显示所有用户列表 |
2 | addUser | POST | JSON 字符串 | 添加新用户 |
3 | deleteUser | DELETE | JSON 字符串 | 删除用户 |
4 | :id | GET | 空 | 显示用户详细信息 |
获取用户列表:
var express = require('express');
var app = express();
var fs = require("fs");
app.get('/listUsers', function (req, res) {
fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
console.log( data );
res.end( data );
});
})
var server = app.listen(8081, function () {
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})
更多详情见:菜鸟教程:https://www.runoob.com/nodejs/nodejs-restful-api.html
五、Node.js 多进程
我们都知道 Node.js 是以单线程的模式运行的,但它使用的是事件驱动来处理并发,这样有助于我们在多核 cpu 的系统上创建多个子进程,从而提高性能。
每个子进程总是带有三个流对象:child.stdin,child.stdout 和 child.stderr。他们可能会共享父进程的 stdio 流,或者也可以是独立的被导流的流对象。
Node 提供了 child_process 模块来创建子进程,方法有:
-
exec - child_process.exec 使用子进程执行命令,缓存子进程的输出,并将子进程的输出以回调函数参数的形式返回。
-
spawn - child_process.spawn 使用指定的命令行参数创建新进程。
-
fork - child_process.fork 是 spawn()的特殊形式,用于在子进程中运行的模块,如 fork('./son.js') 相当于 spawn('node', ['./son.js']) 。与spawn方法不同的是,fork会在父进程与子进程之间,建立一个通信管道,用于进程之间的通信。
更多详情见:菜鸟教程:https://www.runoob.com/nodejs/nodejs-process.html
六、Node.js JXcore 打包
JXcore 是一个支持多线程的 Node.js 发行版本,基本不需要对你现有的代码做任何改动就可以直接安全地以多线程运行。
包代码:
我们使用 jx 命令打包 Node.js 项目的几个文件,并指定 index.js 为 Node.js 项目的主文件:
jx package index.js index
以上命令执行成功,会生成以下两个文件:
-
index.jxp 这是一个中间件文件,包含了需要编译的完整项目信息。
-
index.jx 这是一个完整包信息的二进制文件,可运行在客户端上。
载入 JX 文件:
Node.js 的项目运行:
node index.js command_line_arguments
使用 JXcore 编译后,我们可以使用以下命令来执行生成的 jx 二进制文件:
jx index.jx command_line_arguments
更多详情见:菜鸟教程:https://www.runoob.com/nodejs/nodejs-jxcore-packaging.html
七、Node.js 连接 MySQL
安装驱动:
cnpm install mysql
连接数据库:在以下实例中根据你的实际配置修改数据库用户名、密码及数据库名:
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '123456',
database : 'test'
});
connection.connect();
connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results[0].solution);
});
数据库操作( CURD ):查询数据、插入数据、更新数据、删除数据,以查询数据为例,如下所示:
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '123456',
port : '3306',
database : 'test'
});
connection.connect();
var sql = 'SELECT * FROM websites';
//查
connection.query(sql,function (err, result) {
if(err){
console.log('[SELECT ERROR] - ',err.message);
return;
}
console.log('--------------------------SELECT----------------------------');
console.log(result);
console.log('------------------------------------------------------------\n\n');
});
connection.end();
更多详情见:菜鸟教程:https://www.runoob.com/nodejs/nodejs-mysql.html
八、Node.js 连接 MongoDB
MongoDB是一种文档导向数据库管理系统,由C++撰写而成。
安装驱动:
cnpm install mongodb
创建数据库:
要在 MongoDB 中创建一个数据库,首先我们需要创建一个 MongoClient 对象,然后配置好指定的 URL 和 端口号。
如果数据库不存在,MongoDB 将创建数据库并建立连接。
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/runoob";
MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
if (err) throw err;
console.log("数据库已创建!");
db.close();
});
创建集合:
我们可以使用 createCollection() 方法来创建集合。
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/runoob';
MongoClient.connect(url, { useNewUrlParser: true }, function (err, db) {
if (err) throw err;
console.log('数据库已创建');
var dbase = db.db("runoob");
dbase.createCollection('site', function (err, res) {
if (err) throw err;
console.log("创建集合!");
db.close();
});
});
数据库操作( CURD ):
与 MySQL 不同的是 MongoDB 会自动创建数据库和集合,所以使用前我们不需要手动去创建。
查询数据 find()、插入数据 insertOne() / insertMany()、更新数据 updateOne() / updateMany()、删除数据 deleteOne() / deleteMany() ,以插入数据为例,如下所示:
// 插入单条数据可以使用 insertOne(); 如果要插入多条数据可以使用 insertMany()
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
if (err) throw err;
var dbo = db.db("runoob");
var myobj = { name: "菜鸟教程", url: "www.runoob" };
dbo.collection("site").insertOne(myobj, function(err, res) {
if (err) throw err;
console.log("文档插入成功");
db.close();
});
});
排序:排序 使用 sort() 方法,该方法接受一个参数,规定是升序(1)还是降序(-1)。例如:
-
{ type: 1 } // 按 type 字段升序 { type: -1 } // 按 type 字段降序
查询分页:
- 如果要设置指定的返回条数可以使用 limit() 方法,该方法只接受一个参数,指定了返回的条数。
- 如果要指定跳过的条数,可以使用 skip() 方法。
连接操作:mongoDB 不是一个关系型数据库,但我们可以使用 $lookup 来实现左连接。
例如我们有两个集合数据分别为:集合1:orders 和 集合2:products。
// $lookup 实现左连接
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://127.0.0.1:27017/";
MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
if (err) throw err;
var dbo = db.db("runoob");
dbo.collection('orders').aggregate([
{ $lookup:
{
from: 'products', // 右集合
localField: 'product_id', // 左集合 join 字段
foreignField: '_id', // 右集合 join 字段
as: 'orderdetails' // 新生成字段(类型array)
}
}
]).toArray(function(err, res) {
if (err) throw err;
console.log(JSON.stringify(res));
db.close();
});
});
删除集合:我们可以使用 drop() 方法来删除集合。
更多详情见:菜鸟教程:https://www.runoob.com/nodejs/nodejs-mongodb.html
END