首页 > 编程语言 >2024-03-07-Nodejs(1-Node基础)

2024-03-07-Nodejs(1-Node基础)

时间:2024-03-14 10:46:22浏览次数:15  
标签:Node 03 fs const 07 console js 模块 path

1.初识Nodejs

1.1 思考

  1. 为什么js可以在浏览器中被执行?

    浏览器中具备js解析引擎,其中chrome浏览器的v8引擎最优。

  2. 为什么js可以操作DOM和BOM?

    每个浏览器都内置了DOM和BOM这样的api函数,因此浏览器中的js才可以调用它们。

  3. js运行环境

    运行环境是指代码正常运行所必须的环境。

    image-20240307141653863
    • v8引擎负责解析和执行js代码

    • 内置api是由运行环境提供的特殊接口,只能在所属的运行环境中被调用

  4. js能够做后端开发

    可以,使用nodejs运行环境就行了。

    image-20240307141931502

1.2 node.js简介

  1. 什么是node.js

    node.js是一个基于chrome v8引擎的js运行环境

  2. node.js中的js运行环境

    image-20240307142409820

    • 浏览器是js的前端运行环境
    • node.js是js的后端运行环境
    • node.js中无法调用DOM和BOM等浏览器的内置API
  3. node.js可以做什么?

    node.js作为一个js的运行环境,仅仅提供了基础的功能和API。然而基于node.js提供的这些基础能力,很多强大的工具和框架如雨后春笋般层出不穷:

    1. 基于express,可以快读构建web应用
    2. 基于electron框架可以构建跨平台的桌面应用
    3. 基于restify可以快速构建API接口项目
    4. 读写和操作数据库、创建实用的命令行工具辅助前端开发等等

    node.js是大前端时代的大宝剑,有了node.js的超级buff加持,前段程序员行业竞争力会越来越强。

  4. node好学吗?

    好学

  5. nodejs的学习路径

    js基础语法+nodejs内置模块(fs,path,http等)+第三方模块(express + mysql)

2. fs系统模块

​ fs模块式node.js官方提供的、用来操作文件的模块。它提供了一系列的方法和属性,用来满足用户对文件的操作需求

2.1 读取文件 - fs.readFile()

// 读取指定文件中的内容
fs.readFile(path[, options], callback(err,data))
  • path:文件路径
  • options :配置选项,若是字符串则指定编码格式
  • encoding:编码格式,一般指定utf-8
  • flag:打开方式
  • callback :回调函数
  • err:错误信息,如果读取成功,返回null;如果失败,就是错误对象
  • data:读取的数据,如果未指定编码格式则返回一个 Buffer;读取失败返回undefine
const fs = require("fs");

fs.readFile("./data/1.txt", "utf-8", function (error, dataStr) {
  if (error) {
    return console.log("读取文件失败\n错误内容:" + error.message);
  }
  console.log("读取文件成功\n内容是:" + dataStr);
});

输出结果

读取文件成功
内容是:这是nodejs文本

2.2 写入文件 - fs.writeFile()

fs.writeFile(file, data[, options], callback(error))
  • file:文件路径
  • data:写入内容
  • options:配置选项,包含 encoding, mode, flag;若是字符串则指定编码格式
  • callback:回调函数,文件写入成功,error的值为null;如果写入失败,error的值为一个错误对象
const fs = require("fs")

fs.writeFile(
    "./data/hello.txt",
    "通过 writeFile 写入的内容",
    { flag: "w" },
    function (err) {
        if (!err) {
            console.log("写入成功!");
        } else {
            console.log(err);
        }
    }
);

2.3 案例

整理考试成绩

chengji.txt

小红=100,小明=98,小芳=95,小亮=88,小吴=79

转换为chengji_ok.txt,格式如下

小红:100
小明:98
小芳:95
小亮:88
小吴:79

chengji.js

const fs = require("fs");

// 1. 读取文件
fs.readFile("./data/chengji.txt", "utf-8", function (err, dataStr) {
  if (err) {
    console.log("读取文件失败\n" + err.message);
  }

  //   2. 处理数据
  const arrNew = [];
  const arrOld = dataStr.split(" ");
  arrOld.forEach((item) => {
    arrNew.push(item.replace("=", ":"));
  });

  const newStr = arrNew.join("\r\n");
  //  3. 写出数据

  fs.writeFile("./data/chengji_ok.txt", newStr, function (err) {
    if (err) {
      console.log(err.message);
    }
    console.log("成绩写入成功")
  });
});

2.4 路径动态拼接

  • 在使用 fs 模块操作文件时,如果提供的操作路径是以 ./../ 开头的相对路径时,容易出现路径动态拼接错误的问题
  • 原因:代码在运行的时候,会以执行 node 命令时所处的目录,动态拼接出被操作文件的完整路径
  • 解决方案:在使用 fs 模块操作文件时,直接提供完整的路径,从而防止路径动态拼接的问题
  • __dirname 获取文件所处的绝对路径
console.log(__dirname)

const fs = require("fs");

fs.readFile(__dirname + "/data/1.txt", "utf-8", function (error, dataStr) {
  if (error) {
    return console.log("读取文件失败\n错误内容:" + error.message);
  }
  console.log("读取文件成功\n内容是:" + dataStr);
});

输出结果

D:\03_Learn\12_node
读取文件成功
内容是:这是nodejs文本

3. path

3.1 路径拼接 path.join()

​ path 模块是 Node.js 官方提供的、用来处理路径的模块。它提供了一系列的方法和属性,用来满足用户对路径的处理需求。

const path = require("path")
const pathStr = path.join("/a",'/b/c')
console.log(pathStr)

输出结果

\a\b\c

3.2 获取路径文件名 path.basename()

使用 path.basename() 方法,可以获取路径中的最后一部分,常通过该方法获取路径中的文件名

path.basename(path[, ext])
// path: 文件路径
// ext: 文件扩展名
const path = require('path')

// 定义文件的存放路径
const fpath = '/a/b/c/index.html'

const fullName = path.basename(fpath)
console.log(fullName) // index.html

const nameWithoutExt = path.basename(fpath, '.html')
console.log(nameWithoutExt) // index

输出结果

index.html
index

3.3 获取路径中文件扩展名 path.extname()

const path = require('path')

const fpath = '/a/b/c/index.html'

const fext = path.extname(fpath)
console.log(fext) // .html

输出结果

.html

4.http

http 模块是 Node.js 官方提供的、用来创建 web 服务器的模块。

const http = require('http')

4.1 创建基本 Web 服务器

const http = require('http')

// 创建 web 服务器实例
const server = http.createServer()

// 为服务器实例绑定 request 事件,监听客户端的请求
server.on('request', function (req, res) {
  const url = req.url
  const method = req.method
  const str = `Your request url is ${url}, and request method is ${method}`
  console.log(str)

  // 设置 Content-Type 响应头,解决中文乱码的问题
  res.setHeader('Content-Type', 'text/html; charset=utf-8')
  // 向客户端响应内容
  res.end(str)
})

server.listen(8080, function () {
  console.log('server running at http://127.0.0.1:8080')
})

访问127.0.0.1:8080

image-20240307180944378

4.2 实现简陋路由效果

const http = require('http')
const server = http.createServer()

server.on('request', (req, res) => {
  const url = req.url
  // 设置默认的响应内容为 404 Not found
  let content = '<h1>404 Not found!</h1>'
  // 判断用户请求的是否为 / 或 /index.html 首页
  // 判断用户请求的是否为 /about.html 关于页面
  if (url === '/' || url === '/index.html') {
    content = '<h1>首页</h1>'
  } else if (url === '/about.html') {
    content = '<h1>关于页面</h1>'
  }

  res.setHeader('Content-Type', 'text/html; charset=utf-8')
  res.end(content)
})

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

5.模块化

5.1 模块化概念

  • 模块化是指解决一个复杂问题时,自顶向下逐层把系统划分为若干模块的过程,模块是可组合、分解和更换的单元。
  • 模块化可提高代码的复用性和可维护性,实现按需加载。
  • 模块化规范是对代码进行模块化拆分和组合时需要遵守的规则,如使用何种语法格式引用模块和向外暴露成员。

5.2 Node.js 中模块的分类

  • 内置模块 (由nodejs官方提供,如fs,path,http等)
  • 自定义模块
  • 第三方模块
// 使用require()方法加载模块,可以加载内置模块、自定义模块和第三方模块
const fs = require('fs')

const custom = require("./custom") // 可以省略.js后缀名

// 注意: 在使用require()方法加载模块,会执行加载模块中的代码

5.3 Node.js 中的模块作用域

  • 和函数作用域类似,在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,这种模块级别的访问限制,叫做模块作用域
  • 防止全局变量污染

5.4 模块作用域的成员

  • 自定义模块中都有一个 module 对象,存储了和当前模块有关的信息
  • 在自定义模块中,可以使用 module.exports 对象,将模块内的成员共享出去,供外界使用。
  • 在外界使用require导入自定义模块时,得到的就是 module.exports 指向的对象。
  • 默认情况下,exportsmodule.exports 指向同一个对象。最终共享的结果,以 module.exports 指向的对象为准。

10_module01.js

module.exports.name = "zs"

module.exports.say = ()=>{
    console.log("info")
}

11_module.js

const m = require("./10_module01")
console.log(m)

执行结果

D:\03_Learn\12_node>node 11_module.js
{ name: 'zs', say: [Function (anonymous)] }

当然,上面的10_module01.js的代码可以写成

module.exports = {
    name: "zs",
    say: ()=>{
        console.log("info")
    }
}

由于module.exports写起来比较复杂,为了简化向外共享成员的代码,node提供了exports对象。

默认情况下,exports module.exports指向同一个对象,最终共享的结果还是以module.exports指向的对象为准

5.5 CommonJS 模块化规范

Nodejs遵循Commonjs模块化规范,Commonjs规定了模块的特性和各模块之间如何互相依赖

  • 每个模块内部,module 变量代表当前模块
  • module 变量是一个对象,module.exports 是对外的接口
  • 加载某个模块即加载该模块的 module.exports 属性

5.6 npm与包

​ nodejs的第三方模块就是包,就像电脑和计算机值得是相同的东西一样,第三方模块和包指的是同一个概念,只是不同的叫法而已。

包的来源

​ 不同与nodejs中的内置模块和自定义模块,包是第三方个人或者团队开发出来的,免费供开发者使用

​ 由于nodejs内置的模块仅仅提供了一些底层的API,导致内置模块进行项目开发时,效率较低。包是基于内置模块封装出来的,提供了更高级更方便的API,提高了开发效率。

包的下载

​ 国外有一家 IT 公司,叫做 npm.Inc.这家公司旗下有一个非常著名的网站: https://www.npmjs.com/,它是全球最大的包共享平台,你可以从这个网站上搜索到任何你需要的包,只要你有足够的耐心!

​ 迄今为止,全球约 1100 多万的开发人员,通过这个包共享平台,开发并共享了超过 120 多万个包供我们使用。

​ npm.Inc公司提供了一个地址为 https://registry.npmjs.org/ 的服务器,,来对外共享所有的包,我们可以从这个服务器上下载自己所需要的包。

​ npm.Inc公司提供了一个包管理工具 Node Package Manager(简称 npm 包管理工具),这个包管理工具随着 Node.js 的安
装包一起被安装到了用户的电脑上。

image-20240308110752931
npm install 包的名称
# 或者
npm i 包的名称
# 安装指定版本的包
npm i 包的名称@包的版本
# 如
npm i [email protected]

# 包的版本号是以“点分十进制”形式进行定义的,总共有三位数字,例如 2.24.0其中每一位数字所代表的的含义如下:
# 第1位数字:大版本
# 第2位数字:功能版本
# 第3位数字:Bug修复版本

5.7 npm镜像源

# 查看当前镜像源
npm config get registry
# 切换淘宝镜像源
npm config set registry=https://registry.npm.taobao.org/

使用nrm工具切换可用镜像源

# 安装nrm
npm i nrm -g
# 查看所有可用镜像源
nrm ls
# 切换
nrm use taobao
PS C:\Users\zheng\Desktop> nrm ls
  npm ---------- https://registry.npmjs.org/
  yarn --------- https://registry.yarnpkg.com/
  tencent ------ https://mirrors.cloud.tencent.com/npm/
  cnpm --------- https://r.cnpmjs.org/
  taobao ------- https://registry.npmmirror.com/
  npmMirror ---- https://skimdb.npmjs.com/registry/

标签:Node,03,fs,const,07,console,js,模块,path
From: https://www.cnblogs.com/hasaki-yasuo/p/18072307

相关文章

  • 2024-03-11-Nodejs(3-数据库与身份验证)
    3.数据库与身份验证3.1数据库基本概念数据库是用来组织、存储和管理数据的仓库;传统数据库中,数据结构分为数据库(database)、数据表(table)、数据行(tow)、字段(field)四大部分。3.2配置mysql模块安装mysql模块npminstallmysql建立连接constmysql=require('mysql')......
  • 2024-03-08-Nodejs(2-Express)
    2.Express​ 基于Node.js平台,快速、开放、极简的Web开发框架,Express是用于快速创建服务器的第三方模块。2.1基本使用#安装expressnpminstallexpressconstexpress=require("express");//创建web服务器constapp=express();//监听客户端的GET和POST......
  • 2024-03-11-Nodejs(4-大事件项目)
    4.大事件项目4.1项目初始化项目整体架构图大事件项目 |--- db | |---index.js |---router | |---user.js |---router_handler | |---user.js |---schema | |---user.js |---app.js |---config.js4.1.1创建项目新建api_server文件夹作为项目......
  • 基于ts的node项目引入报错归纳
    一、导入类型定义文件错误node_modules/@types/leaflet/index.d.ts:128:1128export=e;Thismoduleisdeclaredwith'export=',andcanonlybeusedwithadefaultimportwhenusingthe'esModuleInterop'flag.这个错误表明使用export=语法,但TypeSc......
  • 面试题 17.12. BiNodec
    树遍历的变形/***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*/structTreeNode*convertBiNode(structTreeNode*root){if(!root)returnNULL;if(!roo......
  • Node分片上传和OSS上传
    大文件分片切片就是为了解决大文件上传时间过长,优化体验。将大文件拆分成多个小文件,依次上传,上传完毕后合并成源文件。浏览器的Blob提供了slice方法,可以截取某个范围的数据,而文件上传的File就是一种Blob前端可以通过Blob.slice进行文件拆分,然后就是后端文件合并。f......
  • AcWing 503. 借教室(每日一题)
    原题链接:503.借教室-AcWing题库在大学期间,经常需要租借教室。大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室。教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。 面对海量租借教室的信息,我们自然希望编程解决这个问题。我们需要处理接下来......
  • [GPT] nodejs 什么情况下可以使用 import 来引入 export 的模块
    在Node.js中,原生并不支持ES6的import语句来引入模块。不过从Node.jsv12开始,通过实验性功能(--experimental-modules)可以使用.mjs扩展名的文件来启用对ES6模块的支持,并使用import语句。新版本Nodejs已移除了--experimental-modules但是,在生产环境中,为了确保兼......
  • 实验1朱笑雨202383310038
    #include<stdio.h>#include<stdlib.h>intmain(){printf("0\n");printf("<H>\n");printf("II\n");system("pause");return0;}#include<stdio.h>#include<stdl......
  • Node.js毕业设计安全输血医用网站(Express)
    本系统(程序+源码)带文档lw万字以上  文末可获取本课题的源码和程序系统程序文件列表系统的选题背景和意义选题背景:在现代医疗体系中,输血是救治患者的重要手段之一。然而,随着血液资源的日益紧张和血液安全问题的不断凸显,如何确保安全、高效地进行输血成为了一个亟待解决的......