Node.js实用的内置API(二)

简介: 在构建 Node.js 应用程序时,了解 Node.js 开箱即用的实用程序和 API 有助于满足常见用例和开发需求。在文中《Node.js实用的内置API(一)》介绍了两个,本文继续介绍其他实用内置API。

在构建 Node.js 应用程序时,了解 Node.js 开箱即用的实用程序和 API 有助于满足常见用例和开发需求。在文中《Node.js实用的内置API(一)》介绍了两个,本文继续介绍其他实用内置API。

  • util:提供了各种有用的 JavaScript 方法,其中最有用的是 util.promisify(function),它采用错误优先的回调样式函数并返回基于 Promise 的函数。
  • URL:另一个全局对象,安全地创建、解析和修改 Web URL。它对于从 URL 中快速提取协议、端口、参数和 hash 非常有用,而无需借助正则表达式。
  • 文件系统:可以创建、读取、更新和删除文件、目录和权限。

Util

util 模块提供了各种有用的 JavaScript 方法,其中最有用的是 util.promisify(function),它采用错误优先的回调样式函数并返回基于 Promise 的函数。Util 模块还可以帮助处理常见模式,例如解码文本、类型检查和检查对象。

  • util.callbackify(function):接受一个返回承诺的函数并返回一个基于回调的函数。
  • util.isDeepStrictEqual(object1, object2):当两个对象之间存在深度相等时返回 true(所有子属性必须匹配)。
  • util.format(format, [args]):使用类似 printf-like-format 返回一个字符串
  • util.inspect(object, options):返回用于调试的对象的字符串表示形式,类似于使用 console.dir(object, { depth: null, color: true });
  • util.stripVTControlCharacters(str):从字符串中去除 ANSI 转义符
  • util.types:为常见的 JavaScript 和 Node.js 值提供类型检查,如下:
import util from "util";
util.types.isDate(new Date()); // true
util.types.isMap(new Map()); // true
util.types.isRegExp(/abc/); // true
util.types.isAsyncFunction(async () => {}); // true

URL

URL 是另一个全局对象,安全地创建、解析和修改 Web URL。它对于从 URL 中快速提取协议、端口、参数和 hash 非常有用,而无需借助正则表达式。如下:

{
    href: "https: //example.org:8000/path/?abc=123#target",
    origin: "https: //example.org:8000",
    protocol: "https:",
    username: "",
    password: "",
    host: "example.org: 8000",
    hostname: "example.org",
    port: "8000",
    pathname: "/path/",
    search: "?abc=123",
    hash: "#target",
}

可以查看和更改任何属性,如下:

const myUrl = "https://example.org:8001/path/?abc=123#target";
myURL.port = 8001;
console.log(myURL.href); // https://example.org:8001/path/?abc=123#target

然后,可以使用 URLSearchParamsAPI 修改查询字符串值,如下:

myURL.searchParams.delete("abc");
myURL.searchParams.append("xyz", 987);
console.log(myURL.search); // ?xyz=987

dns 模块提供名称解析功能,可以查找 IP 地址、名称服务器、TXT 记录和其他域信息。

文件系统 API

文件系统 APIfs 可以创建、读取、更新和删除文件、目录和权限。 Node.js 运行时的最新版本在 fs/promises 中提供了基于 Promise 的函数,这使得管理异步文件操作变得更加容易。

经常将 fspath 结合使用来解析不同操作系统上的文件名。

以下代码模块使用 stataccess 方法返回有关文件系统对象的信息:

import { constants as fsConstants } from "fs";
import { access, stat } from "fs/promises";
export async function getFileInfo(file) {
    const fileInfo = {};
    try {
        const info = await stat(file);
        fileInfo.isFile = info.isFile();
        fileInfo.isDir = info.isDirectory();
    } catch (e) {
        return { new: true };
    }
    try {
        await access(file, fsConstants.R_OK);
        fileInfo.canRead = true;
    } catch (e) {}
    try {
        await access(file, fsConstants.W_OK);
        fileInfo.canWrite = true;
    } catch (e) {}
    return fileInfo;
}

当传递一个文件名时,该函数返回一个包含该文件信息的对象,如下:

{
  isFile: true,
  isDir: false,
  canRead: true,
  canWrite: true
}

主程序 filecompress.js 脚本使用 path.resolve() 将命令行上传递的输入和输出文件名解析为绝对文件路径,然后使用 getFileInfo() 获取信息:

#!/usr/bin/env node
import path from "path";
import { readFile, writeFile } from "fs/promises";
import { getFileInfo } from "./lib/fileinfo.js";
// check files
const input = path.resolve(process.argv[2] || "");
const output = path.resolve(process.argv[3] || "");
const [inputInfo, outputInfo] = await Promise.all([
    getFileInfo(input),
    getFileInfo(output),
]);
const error = [];

该代码验证路径并在必要时以错误消息终止:

if (outputInfo.isDir && outputInfo.canWrite && inputInfo.isFile) {
    output = path.resolve(output, path.basename(input));
}
if (!inputInfo.isFile || !inputInfo.canRead)
    error.push(`cannot read input file ${input}`);
if (input === output) error.push("input and output files cannot be the same");
if (error.length) {
    console.log("Usage: ./filecompress.js [input file] [output file|dir]");
    console.error("\n  " + error.join("\n  "));
    process.exit(1);
}

使用 readFile() 将整个文件读入名为 content 的字符串:

console.log(`processing ${input}`);
let content;
try {
    content = await readFile(input, { encoding: "utf8" });
} catch (e) {
    console.log(e);
    process.exit(1);
}
const lengthOrig = content.length;
console.log(`file size  ${lengthOrig}`);

JavaScript 正则表达式然后删除注释和空格:

content = content
    .replace(/\n\s+/g, "\n") // 移除行前置空格
    .replace(/\/\/.*?\n/g, "") // 移除单行注释
    .replace(/\s+/g, " ") // 移除空格
    .replace(/\/\*.*?\*\//g, "") // 移除块注释 /* 注释 */
    .replace(/<!--.*?-->/g, "") // 移除HTML注释 <!-- 注释 -->
    .replace(/\s*([<>(){}}[\]])\s*/g, "$1") // 移除括号周围的空格
    .trim();
const lengthNew = content.length;

使用 writeFile() 将生成的字符串输出到文件中,并且状态消息会显示保存:

const lengthNew = content.length;
// write file
console.log(`outputting ${output}`);
console.log(
    `file size  ${lengthNew} - saved ${Math.round(
        ((lengthOrig - lengthNew) / lengthOrig) * 100
    )}%`
);
try {
    content = await writeFile(output, content);
} catch (e) {
    console.log(e);
    process.exit(1);
}

使用示例 HTML 文件运行项目代码:

node filecompress.js ./test/example.html ./test/output.html


相关文章
|
12月前
|
前端开发 JavaScript NoSQL
使用 Node.js、Express 和 React 构建强大的 API
本文详细介绍如何使用 Node.js、Express 和 React 构建强大且动态的 API。从开发环境搭建到集成 React 前端,再到利用 APIPost 高效测试 API,适合各水平开发者。内容涵盖 Node.js 运行时、Express 框架与 React 库的基础知识及协同工作方式,还涉及数据库连接和前后端数据交互。通过实际代码示例,助你快速上手并优化应用性能。
|
Kubernetes API 网络安全
当node节点kubectl 命令无法连接到 Kubernetes API 服务器
当Node节点上的 `kubectl`无法连接到Kubernetes API服务器时,可以通过以上步骤逐步排查和解决问题。首先确保网络连接正常,验证 `kubeconfig`文件配置正确,检查API服务器和Node节点的状态,最后排除防火墙或网络策略的干扰,并通过重启服务恢复正常连接。通过这些措施,可以有效解决与Kubernetes API服务器通信的常见问题,从而保障集群的正常运行。
1012 17
|
JavaScript 前端开发 API
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
JSON 缓存 JavaScript
深入浅出:使用Node.js构建RESTful API
在这个数字时代,API已成为软件开发的基石之一。本文旨在引导初学者通过Node.js和Express框架快速搭建一个功能完备的RESTful API。我们将从零开始,逐步深入,不仅涉及代码编写,还包括设计原则、最佳实践及调试技巧。无论你是初探后端开发,还是希望扩展你的技术栈,这篇文章都将是你的理想指南。
|
JavaScript 前端开发 安全
盘点原生JS中目前最没用的几个功能API
在JavaScript的发展历程中,许多功能与API曾风光无限,但随着技术进步和语言演化,部分功能逐渐被淘汰或被更高效的替代方案取代。例如,`with`语句使代码作用域复杂、可读性差;`void`操作符功能冗余且影响可读性;`eval`函数存在严重安全风险和性能问题;`unescape`和`escape`函数已被`decodeURIComponent`和`encodeURIComponent`取代;`arguments`对象则被ES6的剩余参数语法替代。这些变化体现了JavaScript不断优化的趋势,开发者应紧跟技术步伐,学习新技能,适应新技术环境。
284 10
|
JSON JavaScript 前端开发
深入浅出Node.js:从零开始构建RESTful API
在数字化时代的浪潮中,后端开发作为连接用户与数据的桥梁,扮演着至关重要的角色。本文将引导您步入Node.js的奇妙世界,通过实践操作,掌握如何使用这一强大的JavaScript运行时环境构建高效、可扩展的RESTful API。我们将一同探索Express框架的使用,学习如何设计API端点,处理数据请求,并实现身份验证机制,最终部署我们的成果到云服务器上。无论您是初学者还是有一定基础的开发者,这篇文章都将为您打开一扇通往后端开发深层知识的大门。
379 12
|
JavaScript NoSQL API
深入浅出Node.js:从零开始构建RESTful API
在数字化时代的浪潮中,后端开发如同一座灯塔,指引着数据的海洋。本文将带你航行在Node.js的海域,探索如何从一张白纸到完成一个功能完备的RESTful API。我们将一起学习如何搭建开发环境、设计API结构、处理数据请求与响应,以及实现数据库交互。准备好了吗?启航吧!
|
6月前
|
缓存 监控 前端开发
顺企网 API 开发实战:搜索 / 详情接口从 0 到 1 落地(附 Elasticsearch 优化 + 错误速查)
企业API开发常陷参数、缓存、错误处理三大坑?本指南拆解顺企网双接口全流程,涵盖搜索优化、签名验证、限流应对,附可复用代码与错误速查表,助你2小时高效搞定开发,提升响应速度与稳定性。
|
6月前
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南
|
7月前
|
数据可视化 测试技术 API
从接口性能到稳定性:这些API调试工具,让你的开发过程事半功倍
在软件开发中,接口调试与测试对接口性能、稳定性、准确性及团队协作至关重要。随着开发节奏加快,传统方式已难满足需求,专业API工具成为首选。本文介绍了Apifox、Postman、YApi、SoapUI、JMeter、Swagger等主流工具,对比其功能与适用场景,并推荐Apifox作为集成度高、支持中文、可视化强的一体化解决方案,助力提升API开发与测试效率。