Nodejs最初的学习

添加链接描述
nodejs官网
nodejs中文文档1
nodejs中文文档2

什么是Node.js

  1. Node.js 是一个基于 Chrome V8 引擎 的 Js 运行环境
  2. Node.js使用了一个事件驱动,非阻塞式I/O的模型,使其轻量又高效。

Node.js 运行的js和Chrome运行的js有什么不同?

  1. 几乎一样
  2. 不一样的地方在哪里?
    1. Node.js没有浏览器API,即document,window等。
    2. 加了许多Node.js API
  3. 对于开发者来说,Node.js:
    1. 你在Chrome里写JavaScript控制浏览器。
    2. 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 函数接口文档吗?

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);
  });

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值