nodejs基础


typora-copy-images-to: media

nodejs基础

概念

Node.js 是一个开源与跨平台的JavaScript 运行时环境。它是在浏览器外运行,它是一个事件驱动异步I/O单进程的服务端JS环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。

相关网址:

  • https://nodejs.org/zh-cn/
  • http://nodejs.cn/

注意:

  1. nodejs实现了js代码在浏览器外执行,所以在nodejs中无法运行DOM和BOM的代码
  2. nodejs中除了ECMAScript代码外,还内置了很多其他API
  3. nodejs让js在写前端代码的基础上,可以写后端代码,因为nodejs可以构建服务器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pXxOYchT-1668511932412)(media/1623980565201.png)]

下载安装:

  1. 安装.msi文件,傻瓜式下一步安装
  2. 安装.zip文件,需要手动配置环境变量

模块化开发

nodejs开发基于CommonJS模块化开发规范,将一个js文件定义为一个模块。在项目开发中,能单独拆分的功能,就单独拆分成一个模块。

CommonJS模块化规范的导入导出:

// 导入
require(被导入的文件路径)

// 导出
module.exports = {数据}
module.exports.= 值
exports.=

nodejs的模块分类:

  • 内置模块
  • 第三方模块
  • 自定义模块

nodejs的文件运行:

node 待运行的文件路径

内置模块

fs

fs(file system)模块提供了用于与文件进行交互相关方法。

const fs = require('fs')

// 写入数据(覆盖),追加写使用fs.appendFile
fs.writeFile(文件路径,待写入的数据,err => {})

// 读取文件中数据
fs.readFile(文件路径, 'utf8’,(err,data) => {})

// (同步)检查文件是否存在    返回true/false
// async:异步
// sync:同步
let ret = fs.existsSync(path)

// 获取文件信息(异步)
fs.stat(文件,(err,stats) => {
	stats.isDirectory() // 是否是目录
	stats.isFile()       // 是否为文件
	stats.size            // 文件大小(以字节为单位)
})

// 删除文件(异步)
fs.unlink(文件路径,err => {})

流形式:

var fs=require("fs");
// 读取流模式
var stream=fs.createReadStream("E:\\test\\test10\\server\\config.json");
var data="";
stream.on("data",function(_data){
    data+=_data;
});
stream.on("end",function(){
    console.log(data);
})
// 流形式读取最大的好处就是异步的

// 流式写入,如果是大文件,内容较多,例如视频等就需要流式写入,防止内存卡死
var streamWriter = fs.createWriteStream('c:\\demo\a.txt');
setInterval(function(){
    streamWriter.write(`${new Date}\n`, (error) => {
    console.log(error);
  });
},1000)

// 流形式读取并写入
const fs = require('fs')
const readstream = fs.createReadStream('./note.txt');
readstream.pipe(fs.createWriteStream('./note2.txt'));

监视文件变化:

fs.watch('./logs/log-0.txt', () => {
  console.log(0)
})

os

os(operation system)模块提供了与操作系统相关的实用方法和属性。

const os = require('os')
// 换行符
os.EOL  //根据操作系统生成对应的换行符 window \r\n,linux下面 \n

// cpu相关信息
os.cpus()
// 总内存大小 (单位 字节)
os.totalmem()
// 空余内存大小 (单位 字节)
os.freemem()
// 主机名
os.hostname()
// 系统类型
os.type()

path

path模块用于处理文件和目录(文件夹)的路径。

const path = require('path')

// 获取路径最后一部内容,一般用它来获取文件名称
path.basename('c:/a/b/c/d.html')  // d.html

// 获取目录名,路径最后分隔符部分被忽略
path.dirname('c:/a/b/c/d.html') // c:/a/b/c

// 获取路径中文件扩展名(后缀)
path.extname('c:/a/b/c/d.html') // .html

// 给定的路径连接在一起
path.join('/a', 'b', 'c') // /a/b/c

// resolve:模拟cd(切换目录)操作同时拼接路径
console.log(path.resolve("a", "b", "c"));
console.log(path.resolve("a", "../b", "c"));
console.log(path.resolve("/a", "b", "c"));

__dirname:是nodejs提供的一个内置变量,代表当前文件所在位置的绝对路径

斜杠和反斜杠:通常用来分割路径,"某个文件夹下"的意思,在windows系统中,斜杠和反斜杠的意义是一样的,但是建议大家写斜杠,反斜杠用在代码中,有特殊含义,转义的意思,在服务器系统中,默认路径就使用斜杠

url

url的完整形态:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s51fnc5y-1668511932416)(media/1623983181391.png)]

URL字符串是结构化的字符串,包含多个含义不同的组成部分。 解析字符串后返回的 URL 对象,每个属性对应字符串的各个组成部分。

const url = require('url');
const href = 'http://www.xxx.com:8080/pathname?id=100#bbb'
// 解析网址,返回Url对象
// 参2 如果为true 则 query获取得到的为对象形式
url.parse(href,true)

//以一种 Web 浏览器解析超链接的方式把一个目标 URL 解析成相对于一个基础 URL。
url.resolve('https://lynnn.cn/foo/bar',../'bar') // https://lynnn.cn/bar

例:

const url = require('url')
let href = "http://xiaoming:123456@localhost:80/project/src/userinfo.html?id=5&cat=8#top";
let obj = url.parse(href)
// obj.query是我们比较常用的,因为我们经常会解析路径中的数据
console.log(obj);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E3YZLQqm-1668511932417)(media/1624344004493.png)]

querystring

用于解析和格式化 URL 查询字符串(URL地址的get形式传参)的实用工具。

const querystring = require('querystring')

// query字符串转为对象
querystring.parse('foo=bar&abc=xyz')
querystring.decode('foo=bar&abc=xyz')

// 对象转为query字符串
querystring.stringify({ foo: 'bar',abc: 'xyz'})
querystring.encode({ foo: 'bar',abc: 'xyz'})

http

服务器介绍

Web服务器一般指的是网站服务器(服务器:给用户提供服务的机器就是服务器),是指驻留因特网上某一台或N台计算机的程序,可以处理浏览器等Web客户端的请求并返回相应响应,在服务器上还需要安装服务器软件,目前最主流的三个Web服务器软件是Apache、 Nginx 、IIS

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EpRwnxWw-1668511932418)(media/1624037165360.png)]

ip地址

域名

协议

端口号

创建服务器
// 导入http模块    
const http = require('http')
// 创建web服务对象实例
const server = http.createServer()
// 绑定监听客户端请求事件request
// on方法做事件监听
server.on('request', (request, response) => {})

//	request: 接受客户端请求对象,它包含了与客户端相关的数据和属性
//			   request.url      客户端请求的uri地址
//			   request.method  客户端请求的方式 get或post
//			   request.headers	  客户端请求头信息(对象)
//			   ....
//	response:服务器对客户端的响应对象
//			  设置响应头信息 ,用于响应时有中文时乱码解决处理
//			  response.setHeader('content-type', 'text/html;charset=utf-8')
//			  设置状态码(常见的HTTP状态码有:200,404,301、302、304、403、401、405、500,502)
//			  response.statusCode = 200(默认是200)
//			  response.writeHead(statusCode, [reasonPhrase], [headers]))
//			  statusCode:状态码
//			  reasonPhrase:状态描述
//		  	  headers:头信息
//			  response.write(响应数据) 可调用多次,最终会将多次数据拼接在一起响应
//			  向客户端发送响应数据,并结束本次请求的处理过程
//			  response.end('hello world')
// 启动服务
server.listen(8080, () => {
    console.log('服务已启动')
})
静态资源服务器
// 创建服务器有以下几步:
//  a. 导入
const http = require("http");
const path = require("path");
const fs = require("fs");
//  b. 创建web实例
const server = http.createServer();
//  c. 监听request事件
server.on("request", (req, res) => {
    // 获取当前用户访问的资源路径
    let uri = req.url;
    // 由于“/”没有实体资源,需要将“/”做处理,如果访问“/”则让其对应访问“/index.html”
    if (uri == "/") {
        uri = "/index.html";
    }
    // 默认情况下,浏览器在第一次请求网站的时候会访问“/favicon.ico”图标文件,如果没有也会出现404
    // 如果需要解决这个问题,则有3种方式:
    // 方式1:去找个ico文件,存放在静态资源的public目录下,命名为“favicon.ico”
    // 方式2:在处理的时候忽略“/favicon.ico”文件的处理,也就是下面的加了判断的写法
    // 方式3:不管,不用处理,其不影响页面的显示
    if(uri != '/favicon.ico'){
        // 读取文件(fs模块),将内容返回给用户(res.end)
        let filename = path.join("public", uri);
        // 判断文件是否存在
        if (fs.existsSync(filename)) {
            fs.readFile(filename, (err, data) => {
                if (!err) {
                    // ok
                    res.end(data);
                } else {
                    // 不ok
                    res.setHeader("Content-Type", "text/html;charset=utf-8");
                    res.statusCode = 500;
                    res.end("请求资源出现错误。。。");
                }
            });
        } else {
            res.setHeader("Content-Type", "text/html;charset=utf-8");
            res.statusCode = 404;
            res.end("你要找的资源失踪了。。。");
        }
    }
});
//  d. 监听端口,启动服务
server.listen(8080, () => {
    console.log("server is running at http://127.0.0.1:8080");
});
获取get参数
// 导入
const http = require('http');
const url = require('url');
// 创建实例&监听request事件&监听端口
http.createServer((req, res) => {
    //  之前第3步中的回调函数
	// 获取地址栏中 query数据
	let { query } = url.parse(req.url, true);
	console.log(query);
}).listen(8080)
获取post参数
const http = require('http');
const queryString = require('querystring');
http.createServer((req, res) => {
    let arr = [];
    // 数据接受中
    req.on('data', buffer => {
        arr.push(buffer);
    });
    // 数据传输结束了
    req.on('end', () => {
        // 拼接接受到的所有数据
        let buffer = Buffer.concat(arr);
        let post = queryString.parse(buffer.toString())
        console.log(post);
    });
}).listen(8080)
爬虫
const http = require('http');
http.get(地址,data=>{
    // 通过事件接收数据
})
代理
const http = require('http')
const proxy = require('http-proxy-middleware')

http.createServer((req, res) => {
  let url = req.url

  res.writeHead(200, {
    'Access-Control-Allow-Origin': '*'
  })

  if (/^\/api/.test(url)) {
    let apiProxy = proxy('/api', { 
      target: 'https://m.lagou.com',
      changeOrigin: true,
      pathRewrite: {
        '^/api': ''
      }
    })

    // http-proy-middleware 在Node.js中使用的方法
    apiProxy(req, res)
  }
})

第三方模块

就是网上别人已经开发好的模块,我们可以直接拿来借鉴使用,但是需要下载,下载工具使用npm。

npm工具

下载:

npm install/i 包名
npm i 包名 包名 ...
npm i 包名@版本号 # 最新版本可以使用 @latest

下载命令执行之后,会生成node_modules文件夹,将下载好的包放在这个文件夹中。

这个文件夹的特点:文件比较琐碎,层级嵌套较深,依赖关系较多…

查看所有安装好的局部包:

npm list # 简写 npm ls

卸载:

npm uninstall/un 包名

下载/卸载参数:

--save-dev 简写 -D 表示下载的这个包是一个开发依赖,将来上线后将不需要,只是在本地开发阶段需要
--save 简写 -S 表示下载的这个包是一个生产依赖,将来项目上线后还需要,本地开发和远程上线都需要,npm默认使用--save参数
--global 简写 -g 表示下载的这个包是一个命令,需要在计算机任何一个位置都能使用

初始化:

npm init # 手动输入整个包的信息
npm init -y # 自动生成整个包的信息 - 不能在中文文件夹下使用
# 初始化命令执行以后,会生成package.json文件,生成后在当前目录下安装的所有包,都会自动记录在这个文件中,方便查看、下载、卸载、分析等操作
npm install/i # 安装所有package.json中记录好的包,只安装生产依赖(之前用过-S),不安装开发依赖(之前安装用-D)

初始化的原因:

我们在开发的时候需要依赖很多包,等开发完成后,项目需要上传到服务器环境下运行上线,但node_modules文件夹由于自身的特点,不方便上传,可能在上传过程中造成文件无法上传或文件丢失等问题,所以,我们将项目中依赖的包记录在package.json文件中,在服务器环境中根据记录的包的信息,再次下载即可。

npm切换镜像源:

npm config set registry 镜像源地址 # 切换命令
npm config get registry # 查看镜像源地址
npm --registry https://registry.npm.taobao.org install node-red-contrib-composer@latest # 临时切换使用

查看npm配置项:

npm config list

查看所有全局包:

npm list -g

清除缓存:

npm cache clear --force/-f

查看包的所有版本:

npm view 包名 versions

查看包的使用方式:https://www.npmjs.com/

nrm工具

主要用于操作镜像源。下载安装:

npm i nrm -g

检测版本:

nrm --version # 简写 nrm -v

有的nrm下载好检测版本的时候会报错:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s0epP8gI-1668511932419)(media/1624000328612.png)]

此时对目标报错文件进行修改:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZwH3bCf5-1668511932420)(media/1624000422367.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lZOhR5SS-1668511932422)(media/1624000452194.png)]

nrm命令:

nrm ls # 查看所有镜像源
nrm test # 检测每个镜像源的连接速度
nrm use 指定镜像源名称 # 切换镜像源

自定义模块

可以让一个js中导入另一个js中的数据,导入语法:

require(被导入的文件路径)

注意:

被导入的文件路径如果有./则必须加,不加系统会默认为内置模块

被导入的文件路径中的文件后缀可以省略

导出语法:

exports.= 值
module.exports.= 值
module.exports = {}

注意:导出的时候不能直接给exports赋值。

导出数据都是以对象的形式导出的,导入进去的也都是对象。

npx工具

npm从版本5.2开始,自带了npx命令,如果没有自带则需要手动安装:

npm install -g npx

测试:

npx -v

这个命令通常会有一个特殊的应用场景:

当我们需要临时使用一个第三方包运行,而不像将他下载下来的时候,就是用npx来做。

例:

npx anywhere

当前目录中的node_modules文件夹下有这个包的时候,就是用node_modules文件夹下的包,如果没有,就会从远程下载到内存中,然后从内存中运行,当运行完成后,就将内存中下载好的包删除。

yarn工具

yarn跟npm一样,是一个第三方包的管理工具,比起npm,yarn工具更加高效快捷。

通常在下载一些较为复杂的包的时候,多个包之间总会有一些依赖关系,npm下载的时候,使用续发形式下载,也就是同步下载,而yarn是并发形式下载,也就是异步下载,效率更高。例如,我们需要模块A,但是模块A需要依赖模块B,模块B又需要依赖模块C,npm下载的时候是按照顺序:C—>B—>A;yarn下载的时候是并发下载:A和B和C同时下载。

yarn不是一个自带工具,需要手动下载安装,下载地址:https://yarn.bootcss.com/docs/install/#windows-stable 。傻瓜式安装即可。

检测安装:

yarn --version

初始化:

yarn init
yarn init -y

下载安装包:

yarn addyarn add 包@版本号

卸载包:

yarn remove 包

安装全部依赖:

yarn 
yarn install

nodemon工具

这是一个全局工具,用法跟node一样,但nodemon可以自动监视文件变化,当文件发生变化会自动重新执行命令。

yarn工具

yarn跟npm一样,是一个第三方包的管理工具,比起npm,yarn工具更加高效快捷。

通常在下载一些较为复杂的包的时候,多个包之间总会有一些依赖关系,npm下载的时候,使用续发形式下载,也就是同步下载,而yarn是并发形式下载,也就是异步下载,效率更高。例如,我们需要模块A,但是模块A需要依赖模块B,模块B又需要依赖模块C,npm下载的时候是按照顺序:C—>B—>A;yarn下载的时候是并发下载:A和B和C同时下载。

yarn不是一个自带工具,需要手动下载安装,下载地址:https://yarn.bootcss.com/docs/install/#windows-stable 。傻瓜式安装即可。

检测安装:

yarn --version

初始化:

yarn init
yarn init -y

下载安装包:

yarn addyarn add 包@版本号

卸载包:

yarn remove 包

安装全部依赖:

yarn 
yarn install

nodemon工具

这是一个全局工具,用法跟node一样,但nodemon可以自动监视文件变化,当文件发生变化会自动重新执行命令。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值