Node服务器

101 阅读4分钟

Node服务器

5.1 服务器开发

Node.js 是一个强大的 JavaScript 运行时环境,非常适合用于服务器开发。以下是一些关于如何开始使用 Node.js 开发服务器的资源和步骤:

  1. 设置开发环境

    • 安装 Node.js 和 npm(Node 包管理器)。你可以从 Node.js 官方网站 下载并安装。
    • 使用 npm 安装 Express 框架,这是一个流行的 Node.js 框架,用于构建 web 应用程序和 API。
  2. 创建一个简单的服务器

    • 你可以使用 Node.js 的http模块创建一个简单的 web 服务器。以下是一个基本示例:

      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}/`);
      });
      
    • 将上述代码保存为 server.js 文件,然后在终端中运行 node server.js

  3. 使用 Express 框架

    • Express 使得构建 web 应用程序更加简单和高效。你可以通过以下命令安装 Express:

      npm install express
      
    • 使用 Express 创建一个基本的服务器:

      const express = require('express');
      const app = express();
      const port = 3000;
      ​
      app.get('/', (req, res) => {
        res.send('Hello World!');
      });
      ​
      app.listen(port, () => {
        console.log(`Server running at http://localhost:${port}/`);
      });
      
  4. 学习资源

5.2 内置模块fs

File System 文件系统

const fs = require("fs");
​
// 同步读取文件
// const data = fs.readFileSync("demo.txt");
// console.log(data);// 异步读取文件
// fs.readFile("demo.txt", (err, data) => {
//   if (err) {
//     console.log(err);
//   } else {
//     console.log(data.toString());
//   }
// });// 异步读取文件(promise)
​
fs.promises
  .readFile("demo.txt")
  .then((data) => {
    console.log(data.toString());
  })
  .catch((err) => {
    console.log(err);
  });
​
console.log("后续需要执行的代码");
​

5.3 文件描述符

文件描述符(File descriptors)是什么呢?

  • 在常见的操作系统上,对于每个进程,内核都维护着一张当前打开着的文件和资源的表格。
  • 每个打开的文件都分配了一个称为文件描述符的简单的数字标识符。
  • 在系统层,所有文件系统操作都使用这些文件描述符来标识和跟踪每个特定的文件。
  • Windows 系统使用了一个虽然不同但概念上类似的机制来跟踪资源。

为了简化用户的工作,Node.js 抽象出操作系统之间的特定差异,并为所有打开的文件分配一个数字型的文件描述符。

5.4 常见选项

5.4.1 flag选项

flag的值有很多:nodejs.org/dist/latest…

  • w 打开文件写入,默认值;
  • w+打开文件进行读写(可读可写),如果不存在则创建文件;
  • r打开文件读取,读取时的默认值;
  • r+ 打开文件进行读写,如果不存在那么抛出异常;
  • a打开要写入的文件,将流放在文件末尾。如果不存在则创建文件;
  • a+打开文件以进行读写(可读可写),将流放在文件末尾。如果不存在则创建文件
5.4.2 encoding选项

我们再来看看编码:

文件读取: 如果不填写encoding,返回的结果是Buffer;

5.5 文件夹操作

5.6 events模块

Node中的核心API都是基于异步事件驱动的:

  • 在这个体系中,某些对象(发射器(Emitters))发出某一个事 件;
  • 我们可以监听这个事件(监听器 Listeners),并且传入的回调 函数,这个回调函数会在监听到事件时调用;

发出事件和监听事件都是通过EventEmitter类来完成的,它们都属 于events对象。

  • emitter.on(eventName, listener):监听事件,也可以使用 addListener;
  • emitter.off(eventName, listener):移除事件监听,也可以使用 removeListener;
  • emitter.emit(eventName[, ...args]):发出事件,可以携带一些 参数;

5.7 Buffer和二进制

我们会发现,对于前端开发来说,通常很少会和二进制直接打交道,但是对于服务器端为了做很多的功能,我们必须直接去操作 其二进制的数据;

所以Node为了可以方便开发者完成更多功能,提供给了我们一个类Buffer,并且它是全局的。

我们前面说过,Buffer中存储的是二进制数据,那么到底是如何存储呢?

  • 我们可以将Buffer看成是一个存储二进制的数组;
  • 这个数组中的每一项,可以保存8位二进制: 0000 0000

为什么是8位呢?

  • 在计算机中,很少的情况我们会直接操作一位二进制,因为一位二进制存储的数据是非常有限的;
  • 所以通常会将8位合在一起作为一个单元,这个单元称之为一个字节(byte);
  • 也就是说 1byte = 8bit,1kb=1024byte,1M=1024kb;
  • 比如很多编程语言中的int类型是4个字节,long类型时8个字节;
  • 比如TCP传输的是字节流,在写入和读取时都需要说明字节的个数;
  • 比如RGB的值分别都是255,所以本质上在计算机中都是用一个字节存储的;