Node.js 从小白到菜鸟 1 — 常用语言核心库

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 否则返回 falsestat.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);

以上示例代码创建了 messageexample error messagecode404 的一个错误对象。

更加具体的文档可以参考 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 官方文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • 个人入门学习用笔记、不过多作为参考依据。如有错误欢迎斧正 目录 简书好像不支持锚点、复制搜索(反正也是写给我自己看...
    kirito_song阅读 2,434评论 1 37
  • https://nodejs.org/api/documentation.html 工具模块 Assert 测试 ...
    KeKeMars阅读 6,278评论 0 6
  • Node.js是目前非常火热的技术,但是它的诞生经历却很奇特。 众所周知,在Netscape设计出JavaScri...
    w_zhuan阅读 3,603评论 2 41
  • Node.js是目前非常火热的技术,但是它的诞生经历却很奇特。 众所周知,在Netscape设计出JavaScri...
    Myselfyan阅读 4,057评论 2 58
  • 文件系统模块是一个封装了标准的 POSIX 文件 I/O 操作的集合。通过require('fs')使用这个模块。...
    保川阅读 770评论 0 0