添加链接描述
nodejs官网
nodejs中文文档1
nodejs中文文档2
什么是Node.js
Node.js
是一个基于Chrome V8
引擎 的Js
运行环境Node.js
使用了一个事件驱动,非阻塞式I/O
的模型,使其轻量又高效。
Node.js 运行的js和Chrome运行的js有什么不同?
- 几乎一样
- 不一样的地方在哪里?
- Node.js没有浏览器API,即document,window等。
- 加了许多Node.js API
- 对于开发者来说,Node.js:
- 你在Chrome里写JavaScript控制浏览器。
- Node.js让你用类似的方式,控制整个计算机。
关于 Node.js®
作为一个异步事件驱动的 JavaScript 运行时,Node.js 被设计用来构建可扩展的网络应用。在下面的 “Hello World” 示例中,可以并发处理许多连接,每一个连接都会触发一个回调,而当没有可做的事情时,Node.js 就会进入休眠状态。
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 World');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
这与当今比较常见的采用操作系统线程的并发模型形成了鲜明对比。基于线程的网络效率相对较低且更难以使用。此外,由于没有锁,Node.js 的用户不用担心进程死锁的问题。Node.js 中几乎没有函数直接执行 I/O 操作(除非你使用 Node.js 标准库中的同步函数版本),其进程从不会被阻塞,因此用 Node.js 来开发可扩展系统是非常合理的。
如果你对上面的描述有一些不理解地方,这里有一篇专门关于阻塞对比非阻塞的文章供你参考。
Node.js 在设计上类似于 Ruby 的 Event Machine 或 Python 的 Twisted 之类的系统。但 Node.js 更深入地考虑了事件模型,它将事件循环作为一个运行时结构而不是作为一个库来呈现。在其他系统中,总是有一个阻塞调用来启动事件循环。通常情况下,要执行的行为是通过脚本开始时的回调来定义的,然后通过 EventMachine::run()
这样的阻塞调用来启动服务器。而在 Node.js 中,没有这种启动事件循环的调用。Node.js 在执行输入脚本后直接进入事件循环,当没有更多的回调要执行时,Node.js 就会退出事件循环。这种行为就像浏览器的 JavaScript 一样 —— 事件循环对用户是隐藏的。
HTTP 是 Node.js 中的一等公民,设计时考虑到了流式和低延迟,这使得 Node.js 非常适合作为网络库或框架的基础。
Node.js 被设计成单线程运行,但这并不意味着你无法利用到 CPU 的多个核心。你可以通过 child_process.fork()
API 来生成子进程,并且它被设计成非常易于通信。而建立在同一个接口之上的 cluster
模块允许你在进程之间共享套接字(sockets),以实现核心的负载均衡。
API 函数接口文档
API 函数接口文档 提供了在 Node.js 中的函数或者对象的详细信息。这个文档告诉你什么方法该用什么参数,方法返回值是什么以及使用那个方法会有什么错误异常。它同时也告知你不同版本中的 Node.js 有哪些方法是可用的。
此文档描述了 Node.js 内建的模块,社区提供的模块并不记载在内。
在寻找先前发布的 API 函数接口文档吗?
- Node.js 17.x
- Node.js 15.x
- Node.js 14.x
- Node.js 13.x
- Node.js 12.x
- Node.js 11.x
- Node.js 10.x
- Node.js 9.x
- Node.js 8.x
- Node.js 7.x
- Node.js 6.x
- Node.js 5.x
- Node.js 4.x
- Node.js 0.12.x
- Node.js 0.10.x
- 所有版本
nodejs常见方法的使用
const fs = require("fs");
fs.writeFileSync("test.txt", "Hello, World!");
fs.readFile("test.txt", "utf8", (err, data) => {});
fs.truncate("test.txt", 5, (err) => {});
fs.mkdir("testDir", (err) => {});
fs.readdir(".", (err, files) => {});
fs.stat("test.txt", (err, stats) => {
if (err) throw err;
console.log(`Is file: ${stats.isFile()}`);
console.log(`Is directory: ${stats.isDirectory()}`);
console.log(`Size: ${stats.size} bytes`);
});
fs.unlink("test.txt", (err) => {});
fs.rmdir("testDir", (err) => {});
const fs = require("fs");
// 检查文件是否存在,并进行读写权限检查
fs.access("/路径/文件名", (err) => {
if (err) throw err;
console.log("文件已存在,且可读可写");
});
// 在文件尾部追加内容
fs.appendFile("/路径/文件名", "新内容", (err) => {
if (err) throw err;
console.log("内容已追加到文件末尾");
});
// 修改文件权限(示例中为修改为0666)
fs.chmod("/路径/文件名", 0o666, (err) => {
if (err) throw err;
console.log("文件权限已更改");
});
// 更改文件所有者与群组(示例中为将owner和group改为1001)
fs.chown("/路径/文件名", 1001, 1001, (err) => {
if (err) throw err;
console.log("文件所有者和群组已更改");
});
// 关闭文件描述符
fs.close(fd, (err) => {
if (err) throw err;
console.log("文件描述符已关闭");
});
// 文件常量(如F_OK,R_OK,W_OK,X_OK,MYSYMBOLICLINK)
console.log(fs.constants);
// 复制文件
fs.copyFile("/路径/源文件名", "/路径/目标文件名", (err) => {
if (err) throw err;
console.log("源文件已成功复制到目标文件");
});
// 创建一个可读流
let readableStream = fs.createReadStream("/路径/文件名");
readableStream.on("data", function (chunk) {
console.log(chunk);
});
// 创建一个可写流
let writableStream = fs.createWriteStream("/路径/文件名");
writableStream.write("写入的内容");
// 判断文件是否存在(deprecated,不建议使用)
fs.exists("/路径/文件名", (exists) => {
if (exists) {
console.log("文件存在");
} else {
console.log("文件不存在");
}
});
// 修改文件描述符权限
fs.fchmod(fd, "0o755", (err) => {
if (err) throw err;
console.log("已更改文件描述符的权限");
});
// 更改文件描述符所有者与群组
fs.fchown(fd, 1001, 1001, (err) => {
if (err) throw err;
console.log("已更改文件描述符所有者和群组");
});
// 强制将文件系统缓冲区写入到文件中(以确保数据的同步)
fs.fdatasync(fd, (err) => {
if (err) throw err;
console.log("已同步文件与文件系统缓冲区");
});
// 获取文件状态信息
fs.fstat(fd, (err, stats) => {
if (err) throw err;
console.log(`这是文件的大小:${stats.size}`);
});
// 强制将文件刷新到存储器
fs.fsync(fd, (err) => {
if (err) throw err;
console.log("已强制将文件更新到存储器");
});
// 截断文件
fs.ftruncate(fd, len, (err) => {
if (err) throw err;
console.log("已截断文件");
});
// 指定文件的上次访问和修改时间
fs.futimes(fd, atime, mtime, (err) => {
if (err) throw err;
console.log("上次访问和修改时间已更改");
});
// 更改符号链接文件的权限
fs.lchmod("/路径/文件名", "0o755", (err) => {
if (err) throw err;
console.log("符号链接文件的权限已更改");
});
// 更改符号链接文件所有者和群组
fs.lchown("/路径/文件名", 1001, 1001, (err) => {
if (err) throw err;
console.log("符号链接文件的所有者和群组已更改");
});
// 获取文件信息(不会跟随符号链接)
fs.lstat("/路径/文件名", (err, stats) => {
if (err) throw err;
console.log(`这是文件的链接数:${stats.nlink}`);
});
// 创建硬链接
fs.link("/路径/源文件名", "/路径/目标文件名", (err) => {
if (err) throw err;
console.log("已成功创建硬链接");
});
// 修改符号链接文件上次访问和修改时间
fs.lutimes("/路径/文件名", atime, mtime, (err) => {
if (err) throw err;
console.log("符号链接文件的上次访问和修改时间已更改");
});
// 创建新目录
fs.mkdir("/路径/目录名", { recursive: true }, (err) => {
if (err) throw err;
console.log("已成功创建新目录");
});
// 创建临时目录
fs.mkdtemp("/路径/目录名", (err, folderPath) => {
if (err) throw err;
console.log(`已成功创建临时目录:${folderPath}`);
});
// 打开文件并返回其描述符
fs.open("/路径/文件名", "w+", (err, fd) => {
if (err) throw err;
console.log(`文件已打开(文件描述符为${fd})`);
});
// 打开目录并返回其文件描述符
fs.opendir("/路径/目录名", (err, dir) => {
if (err) throw err;
console.log(`目录已打开(描述符为${dir.fd})`);
});
// 基于Promise的fs方法
const fsPromises = require("fs").promises;
// 读取文件信息
fsPromises
.stat("/路径/文件名")
.then((stats) => {
console.log(`这是文件的大小:${stats.size}`);
})
.catch((err) => {
console.error(err);
});
// 读取文件内容
fsPromises
.readFile("/路径/文件名", "utf8")
.then((data) => {
console.log(`这是文件内容:${data}`);
})
.catch((err) => {
console.error(err);
});