Node.js

132 阅读6分钟

Node

安装

image-20220126154238304.png

  • 单击下好的软件,按提示默认安装
  • 安装结束之后通过查看软件版本的方式检查是否安装成功

win+R键输入cmd,打开windows终端,在终端中输入node空格-v指令回车,如果出现下方图片红色圈中的内容,说明安装成功

image-20220126155049906.png

如果没有显示版本号,说明安装不成功,需重新安装。

终端常用命令

cd 路径地址   #去往指定的目录下
esc   # 清除当前已输入的命令
tab   # 快速补全文件名
cls命令   #清空终端内容

模块化(Natives modules)

把复杂的问题拆分成多个小的模块,好处就是可以提高代码的复用性、可维护性,并且可以实现按需加载。

  • 规范

遵循一定的规则将代码拆分成多个模块

  • 加载模块require()

加载模块需要使用require()方法,要加载对应的模块只需在require()方法的括号中写入要加载模块的名字或路径即可,例如要加载文件系统模块require('fs'),加载内置模块和第三方模块直接在括号内写模块名字即可,加载自定义模块需要写自定义模块的文件路径例如require(./styles.js)

  • 模块作用域

在自定义模块中定义的变量和方法,只能在当前模块下被访问 防止了全局变量污染

  • module对象

每个自定义模块中都有一个module对象,里面存储了与当前模块有关的信息

  1. exports属性

内置模块

nodejs官方提供的模块,在安装node之后就已经存在,内置模块的使用官网中也都有介绍

fs文件处理模块

使用fs模块之前需要先导入该模块 const fs = fs.require('fs')

API fs.readFile() fs.writteFile()

fs.readFile(path[, options], callback) 读取指定文件内容

const fs = require('fs');

fs.readFile('./one1.txt', 'utf8', (err, data) => {
  err ? console.log('读取文件失败') : console.log(data);
  // console.log(err);  // 如果文件读取成功err将返回null,否则将返回一个错误对象
  // console.log(data); // data是读取文件中的内容,成功将会打印在终端,失败则不打印
})

fs.writteFile() 向文件中写入内容

    const fs = require('fs');

fs.writeFile('./one1.txt', 'nodejs学完学webpack,最后学框架', 'utf8', err => {
  err === null ?
    (console.log('写入成功'),
      fs.readFile('./one1.txt', 'utf8', (err, data) => {
        err ? console.log('读取失败')
          : console.log(data);
      }))
    : console.log('写入失败');
})

例子:

    const fs = require('fs');

fs.readFile(__dirname+'/成绩.txt', 'utf8', (err, data) => {
  err ?
    console.log('读取文件失败' + '\n' + err.message)
    : console.log('读取文件成功' + '\n' + data);

  const arrold = data.split(' ')
  console.log(arrold);

  const arr = arrold.map(datas => {
    datas = datas + ''
    return datas
  })
  console.log(arr);
  let strs = arr.join('\r\n');
  console.log(strs);


  fs.writeFile(__dirname+'/2成绩.txt', strs, err => {
    err ? console.log('成绩写入失败') : console.log('成绩写入成功!');
  })
})

__dirname,当前文件所处的目录

path路径处理模块

path.join([...paths]) 路径拼接

   const fs = require('fs');
const path = require('path');

// ../ 会抵消前面的路径

const pathstr = path.join('/a', '/b/c', '../', './d', 'e')
console.log(pathstr); // \a\b\d\e
console.log(__dirname);
fs.readFile(path.join(__dirname, '/two.txt'), 'utf8', (err, data) => {
  err ? console.log('文件读取失败' + '\n' + err) : console.log('文件读取成功' + '\n' + data);
})

path.basename(path[,ext]) 获取路径文件名

    const path = require('path');

    const newfile = path.basename(path.join(__dirname, '/two.txt'), '.txt')
    console.log(newfile); // two

path.extname(path) 获取文件扩展名

    const path = require('path');
    
    const filenew = path.extname(path.join(__dirname, '/two.txt'))
    console.log(filenew); // .txt

http服务器模块

http模块用来创建web服务器,通过http.createServer()方法,可以方便的把一台普通的电脑变成一台web服务器。 服务器和普通电脑区别在于是否安装了web服务器,常用服务器软件有IIS、Apache等 在nodejs中,我们可以基于nodejs提供的http模块,手写一个服务器软件

  • 了解服务器
  1. IP地址

每台计算机都有一个唯一的ip地址,格式一般为“点分十进制”(1.2.3.4)这种形式呈现,取值范围在0~255的整数,例如 192.168.0.1

  1. 域名&域名服务器

为了使网站地址更直观更方便记忆,后来又发明了一套字符类型的地址,叫做域名。例如:www.baidu.com 每一个域名都对应一个ip地址,它们之间的对应关系被存放在域名服务器(DNS)中。域名服务器的作用就是将用户输入的域名地址转换成对应的ip地址(域名转换)。 开发测试专用ip地址(127.0.0.1)和域名(localhost),代表我们自己的电脑

  1. 端口号

每个web服务都对应一个唯一的端口号,web服务器通过判断端口号找到对应的web服务进行处理。现实中80端口可以被省略。

  • 创建web服务器
  1. 导入http模块const http = require('http')
    const http = require('http');
  1. 创建web服务器实例,通过http.createServer()方法
    const http = require('http');

    const server = http.createServer();
  1. 给服务器绑定request事件
    const http = require('http');

    const server = http.createServer();

    server.on('request', (req,res) => {
      const str = `Your request url is ${req.url} and your request method is ${req.method}`
      res.end(str);
    })
    // req.url是服务器访问的地址路径,req.method是地址调用的请求方法,res.end()方法是将str内容响应到客户端
  1. 启动服务器
    const http = require('http');

    const server = http.createServer();

    server.on('request', (req,res) => {
      const str = `Your request url is ${req.url} and your request method is ${req.method}`
      res.end(str);
    })

    server.listen(80, () => {
      console.log('server running at http://127.0.0.1');
    })
    // 在控制台中执行该文件,执行成功会打印“server running at http://127.0.0.1”这句话,
    // 通过按住ctrl键,并且鼠标左键单击ip地址(http://127.0.0.1),浏览器就会弹出页面,并且展示str中的内容
  1. 解决中文乱码问题
const http = require('http');

const server = http.createServer();

server.on('request', (req, res) => {
  const str = `您请求的 URL 地址是${req.url},请求的 method 类型是 ${req.method}`;
  
  res.setHeader('Content-Type', 'text/html; charset=utf-8');// 解决中文乱码问题,固定写法,不加这句中文会解析成乱码
  
  res.end(str);
})

server.listen(80, () => {
  console.log('server running at http://127.0.0.1');
})
  • 根据不同的url响应不同的html内容
const http = require('http');

const server = http.createServer();

server.on('request', (req, res) => {
  // 1. 获取url地址
  const url = req.url
  // 3. 设置默认响应内容 404 Not found
  let content = '404 Not found';
  // 4. 判断请求的是哪个页面
  if (url === '/' || url === '/index.html') {
    content = '<h1>首页</h1>'
  } else if (url === '/about.html') {
    content = '<h1>关于页面</h1>'
  }
  // 5. 设置响应头`Content-Type`, 防止中文乱码
  res.setHeader('Content-Type', 'text/html;charset=utf-8')
  // 6. 把内容响应给客户端
  res.end(content);
})

server.listen(8080, () => {
  console.log('server running at http://127.0.0.1:8080');
})
  • 将真实的文件路径提供给服务器
const http = require('http');
const fs = require('fs');
const path = require('path');

const server = http.createServer();

server.on('request', (req, res) => {
  const url = req.url
  let fpath = '' // 定义一个空的变量
  if (url === '/') {
      // 如果url地址为'/',给fpath赋值,指定文件路径
    fpath = path.join(__dirname, '/shizhong.html')
  } else {
      // 否则,指定fpath值为默认url路径
    fpath = path.join(__dirname, url)
  }
  // 读取fpath路径下的文件内容
  fs.readFile(fpath, 'utf8', (err, data) => {
    if (err) {
      // 如果fpath路径下的文件内容读取失败,重新定义一个变量,值为404.html文件的路径地址
      const errpath = path.join(__dirname, '/404.html')
      // 读取404.html文件的内容
      fs.readFile(errpath, 'utf8', (err, data) => {
          // 如果读取失败,则响应客户端‘404 Not found’,成功则响应404文件内容
        err ? res.end('404 Not found') : res.end(data)
      })
    } else {
        //fpath路径下的文件内容读取成功,将内容响应给客户端
      res.end(data)
    }
  })
})

server.listen(80, () => {
  console.log('server running at http://127.0.0.1');
})

自定义模块

用户创建的js文件都属于自定义模块

模块化规范CommonJS规范

第三方模块

由第三方开发的模块,使用前需先下载

npm包

Express(基于http模块封装出来的)

路由

中间件

next参数 app.use()全局生效中间件 局部中间件

  • 中间件的分类
  1. 应用级别中间件
  2. 路由级别中间件
  3. 错误级别中间件
  4. express.static
  5. express.json
  6. express.urlencoded
  • 自定义中间件

编写接口

  1. 创建服务器
  2. 创建API路由模块
  3. 编写get接口
  4. 编写post接口
  5. CORS中间件解决接口跨域

数据库

web开发模式

  • 服务器端渲染模式
  • 前后端分离模式

底层(v8引擎)