Node.js 从小白到菜鸟系列文章记录本人从一个小白到依靠 Node.js 混口饭吃的历程。此篇为 Node.js 从小白到菜鸟系列文章的第一篇,记录的 Node.js 服务端开发常用的语言核心模块使用方式。此篇文章内容看不懂或记不住都没关系,这仅仅是入门第一步,了解一下开发中有哪些常用功能,可以使用 Node.js 提供的那些模块来实现。
Crypto
Crypto 是 Node.js 提供的加密库,用来应对开发中尝尝需要的加密工作。常用的函数为 createHash()
计算哈希值,以下使用 md5
为例来展示 Crypto 常用方式。
// 计算 md5 值
const crypto = require('crypto'); // 引入 Crypto
function md5(data) {
return crypto
.createHash('md5') // 创建 md5 方法
.update(data, 'utf8') // 使用输入数据计算哈希值,设置数据编码为 utf8
.digest('hex'); // 结果为 16 进制小写的格式
}
console.log(md5('example string'));
以上示例代码中,createHash()
为创建计算哈希值方法,这里使用了 md5
方法,可以根据需要设置为 sha1
等其他方法;update()
使用输入数据计算哈希值,指定数据编码方式为 utf8
,这里需要注意,如果没有指定 utf8
数据编码格式,最终计算出来的结果可能与其他编程语言计算出的结果不一致;digest()
为设置结果格式,这里使用了 16 禁止小写的格式,可以根据需要设置为 base64
等其他格式。
更加具体的文档可以参考 Node.js 官方文档
File System
File System 为 Node.js 提供的文件系统操作方法。在服务端开发过程中像记录日志、读取配置信息等工作都要涉及到文件的操作,以下简单介绍操作文件的几种方法。
fs.stat()
获取文件状态
// 获取文件状态
const fs = require('fs');
fs.stat('./example.json', function (err, stat) {
if (err) {
return console.log(err);
}
console.log(stat);
console.log(stat.isDirectory());
console.log(stat.isFile());
});
// 获取文件状态报错结果
// { Error: ENOENT: no such file or directory, stat './example.json'
// errno: -2,
// code: 'ENOENT',
// syscall: 'stat',
// path: './example.json' }
// 获取文件状态正常结果
// Stats {
// dev: 16777220,
// mode: 33188,
// nlink: 1,
// uid: 501,
// gid: 20,
// rdev: 0,
// blksize: 4096,
// ino: 35186549,
// size: 3705,
// blocks: 8,
// atimeMs: 1503294130000,
// mtimeMs: 1503294128000,
// ctimeMs: 1503294128000,
// birthtimeMs: 1503293942000,
// atime: 2017-08-21T05:42:10.000Z,
// mtime: 2017-08-21T05:42:08.000Z,
// ctime: 2017-08-21T05:42:08.000Z,
// birthtime: 2017-08-21T05:39:02.000Z }
获取文件状态使用 fs.stat()
函数,第一个参数是想要获取状态的文件地址,第二个参数是回调函数。返回的结果如上所示,当文件不存在时会报错,如果文件状态正常获取后会得到一个 Object
代表文件的各属性。在开发中常用的一个操作是判断给定地址是文件还是文件夹,这时可以使用 stat.isDirectory()
和 stat.isFile()
函数。stat.isDirectory()
在给定地址是文件夹时返回 true
否则返回 false
;stat.isFile()
在给定地址是文件时返回 true
否则返回 false
;
fs.readFile()
读取文件内容
fs.readFile('./example.json', {
encoding: 'utf8'
}, function (err, data) {
if (err) {
return console.log(err);
}
console.log(data);
});
fs.readFile()
第一个参数是想要获取内容的文件地址,第二个参数是附加参数对象,是可选参数,这里设置了返回文件内容编码为 utf8
,第三个参数为回调函数。
fs.writeFile()
写入文件内容
const data = "Hello, world!";
fs.writeFile('./example.json', data, {
encoding: 'utf8'
}, function (err) {
if (err) {
return console.log(err);
}
return console.log('write content to file success');
});
fs.writeFile()
向文件中写入内容,新写入的内容会覆盖原始文件的所有内容。
fs.appendFile()
追加文件内容
const data = "Hi!";
fs.appendFile('./example.json', data, {
encoding: 'utf8'
}, function (err) {
if (err) {
return console.log(err);
}
return console.log('append content to file success');
});
fs.appendFile()
向文件追加内容,新内容不会覆盖原始文件内容,会在原始内容尾部添加新内容。
更加具体的文档可以参考 Node.js 官方文档
Errors
Errors 是 Node.js 提供的错误类,我们可以使用它创建错误信息。
const EXAMPLE_ERROR_CODE = 404;
const err = new Error('example error message');
console.log(err);
err.code = EXAMPLE_ERROR_CODE;
console.log(err);
console.log(err.message);
console.log(err.code);
以上示例代码创建了 message
为 example error message
,code
为 404
的一个错误对象。
更加具体的文档可以参考 Node.js 官方文档
HTTP
HTTP 应该是 Node.js 中最重要的一个模块了,Node.js 服务端开发都是基于 HTTP 模块的。利用 HTTP 模块创建 HTTP server 监听某个端口等待客户端的请求。下面以最常用的 Hello world!
示例来展示 Node.js HTTP 模块的使用。
const http = require('http');
function handler(req, res) {
console.log(req.url);
res.write('Hello world!');
res.end();
}
const app = http.createServer(handler);
app.listen(3000, function () {
console.log('server listen on: 0.0.0.0:3000');
});
HTTP 最常用的是 http.createServer()
,http.createServer()
接受一个函数作为参数,此函数第一个参数是 HTTP 请求对象,这里命名为 req
,第二个参数是 HTTP 响应对象,这里命名为 res
。使用 req
获取此次请求客户端的数据,使用 res
向客户端响应数据。示例中打印了客户端请求的 URL,并向客户端响应 Hello world!
。
http.createServer()
创建了一个 HTTP server,我们还要设置监听端口来启动 HTTP server,示例中使用了 3000 端口,可以根据需要修改为任意合法的端口。
更加具体的文档可以参考 Node.js 官方文档
Path
Path 是 Node.js 提供的处理路径的模块,在开发中获取一个路径的绝对路径,计算两个路径的相对路径等是很常见的需求。以下简单介绍几个常用的路径操作函数。
path.resolve()
获取绝对路径
const os = require('os');
const path = require('path');
function absolutePath(data) {
let result = path.resolve(data);
if (result.indexOf('~') !== -1) {
result = `${os.homedir()}${result.slice(result.indexOf('~') + 1)}`;
}
return result;
}
console.log(absolutePath('..'));
console.log(absolutePath('~/Desktop'));
path.resolve()
函数会返回输入路径的绝对路径,这个绝对路径依赖于用户当前的工作路径(process.env.cwd()
)。path.resolve()
对于输入格式为 ~/example_path
的路径会直接拼接用户当前的工作路径与 ~/example_path
,所以示例中的 absolutePaht()
在入户输入了 ~/example_path
时使用 os.homedir()
获取到用户的 home 路径,然后与 path.resolve()
结果中 ~
后的部分拼接得到绝对路径,很多获取绝对路径的包中也采用示例中的方式。
path.join()
拼接路径
const path = require('path');
console.log(path.join(__dirname, '..', '..', 'example_path'));
path.join()
会将输入的参数拼接成路径,__dirname
是当前代码文件的绝对路径,使用 path.join()
拼接路径而不是 console.log(
${__dirname}/../../example_path)
是因为在不同操作系统中路径分隔符不同,Windows 操作系统中是 \
而 *nix 操作系统中是 /
,path.join()
或根据操作系统选择争取的分隔符。
更加具体的文档可以参考 Node.js 官方文档
总结
以上介绍的都是开发中经常用到的模块,对于一个刚刚入门的同学来说记不住这些也没关系,也不用死记硬背,对于目录和各种功能有个印象即可。在开发过程中根据需求需要用到哪些模块时可以再回来查看或者直接参考 Node.js 官方文档