美文网首页
nodejs基础

nodejs基础

作者: 渚清与沙白 | 来源:发表于2023-11-12 14:46 被阅读0次
  • global
    nodeJs中的顶级对象是global,它是Node.js的全局对象,所有全局变量和函数都挂载在global对象上。类似于浏览器环境中window对象。
    globalThis是ES2020引入的新特性,用它来指向global对象。

Buffer

Buffer是nodejs提供的内置对象,是一个类似数组的对象,用于表示固定长度的字节序列。本质是一段内存空间,专门用来处理二进制数据

  • 特点
  1. 大小固定,无法调整
  2. 性能好,可以直接操作内存
  3. 每个元素大小为1字节
  • Buffer的创建
  1. alloc
    let buf = Buffer.alloc(10); 会对旧数据清空
    <Buffer 00 00 00 00 00 00 00 00 00 00>
  2. allocUnsafe
    let buf = Buffer.allocUnsafe(10); 可能会包含旧的内存数据,速度比alloc快
    <Buffer 00 00 40 00 00 3f 00 00 00 00>
  3. from
    3.1 传递字符串
    let buf = Buffer.from('hello');
    <Buffer 68 65 6c 6c 6f>
    3.2 传递数组
    let buf = Buffer.from([100,233,45,56,43]);
    <Buffer 64 e9 2d 38 2b>
  • Buffer的操作
  1. 字符串转换 toString
    buf.toString() 默认 utf-8
  2. 元素读写
    通过下标操作元素
let buf = Buffer.from('hello')
console.log(buf[0].toString(2))//转成二进制 01101000
console.log(buf)// <Buffer 68 65 6c 6c 6f> 
buf[0] = 95;
console.log(buf.toString())//<Buffer 68 65 6c 6c 6f> _ello
  • 溢出
let buf = Buffer.from('hello')
buf[0] = 361;// 最大255  舍弃高位的数字  0001 0110 1001 => 0001 0110
console.log(buf)//<Buffer 69 65 6c 6c 6f>
  • 中文
let buf = Buffer.from('您好')// utf-8 编码  一个汉字占3个字节
console.log(buf)//<Buffer e6 82 a8 e5 a5 bd>

fs模块

操作文件的内置模块

写入文件
// 是用于写入频次较低
fs.writeFile();// 异步
fs.writeFileSync();// 同步

// 追加
fs.appendFile();// 异步
fs.appendFileSync();// 同步

// 流式写入 是用于频次较高
let ws = fs.createWriteStream();
ws.write();// 流式写入
ws.close();// 可选  写入完毕会自动关闭
读取文件
// 读取文件  一次性全部读取
fs.readFile();// 异步

fs.readFileSync();// 同步

// 读取流式文件  一块一块地读取  提高读取效率
let rs = fs.createReadStream('test.txt');
rs.on('data', (chunk) => {// chunk 64kb
  console.log(chunk);
});
// 可选事件
rs.on('end', () => {
  console.log('读取完毕');
});
复制文件
const rs = fs.createReadStream('test.txt');
const ws = fs.createWriteStream('test-1.txt');
rs.on('data', function (chunk) {
  ws.write(chunk);
});
// 也可以这样读取写入
rs.pipe(ws);

fs.copyFile(src, dest, [mode], callback)

重命名、移动文件

重命名、移动文件本质一样,都是在更改文件路径
fs.rename(oldPath, newPath, callback)
fs.renameSync(oldPath, newPath)

删除文件

fs.unlink(path, callback)
fs.unlinkSync(path)

fs.rm(path,callback)
fs.rmSync(path)

创建目录

fs.mkdir(path, [options], callback)
fs.mkdirSync(path, [options])
fs.mkdir(’/tmp/a/b/c/d’, {recursive: true}, callback)//递归创建

读取文件夹

fs.readdir(path, callback)
fs.readdirSync(path)
fs.readdirSync('./')// 读取当前文件夹

删除目录

【rmdir 即将过时】
fs.rmdir(path, callback)
fs.rmdirSync(path)
fs.rmdir('./a/b',{recursive:true},callback)// 递归删除
【建议使用】rm
fs.rm(path, callback)

查看资源状态

fs.stat(path, callback)
fs.statSync(path)

路径
  • 相对路径
    参照物是命令行的工作目录,不是js文件当前目录
    ./:当前目录
    ../:上级目录
    ./:当前目录
  • 绝对路径
    盘符开头C:\Users\Administrator\Desktop
    /开头:盘符根目录下/html
    在使用fs时,推荐使用绝对路径,相对路径可能会出现一些问题
  • --dirname
    该变量保存的是所在文件的所在目录的绝对路径
  • --filename
    该变量保存的是文件的绝对路径

path模块

path.resolve(path) :拼接规范的绝对路径
path.resolve(__dirname, './index.html')// 第一个参数是绝对路径,后面的参数都是相对路径
path.sep : 获取操作系统的路径分隔符
path.basename(path) :获取路径的基础名称
path.extname(path) : 获取路径的扩展名
path.dirname(path) : 获取路径的目录名
path.parse(path) : 解析路径并返回对象

http模块

获取请求数据

req.url : 获取请求的url
req.method : 获取请求的方法
req.headers : 获取请求头
req.httpVersion:http版本号

提取URL中的路径和查询字符串

  1. 借助内置库 url 旧版
let l = url.parse(req.url, true);
let pathname = l.pathname;
let query = l.query;

{
  protocol: null,
  slashes: null,
  auth: null,
  host: null,
  port: null,
  hostname: null,
  hash: null,
  search: '?a=1&f=l',
  query: [Object: null prototype] { a: '1', f: 'l' },
  pathname: '/ssjj',
  path: '/ssjj?a=1&f=l',
  href: '/ssjj?a=1&f=l'
}
  1. new URL() 新版
let url = new URL(req.url,'http://127.0.0.1');
let pathname = url.pathname
let query = url.searchParams.get('a')
设置响应体

response.write()// 可以有多个
response.end()// 只能有一个end()

const http = require('http');
// const url = require('url');

const server = http.createServer((req, res) => {
    let { method } = req;
    let { pathname } = new URL(req.url, 'http://127.0.0.1');

    res.writeHead(200, {
        'Content-Type': 'text/html;charset=utf-8'
    });
    if(method === 'GET' && pathname === '/login'){
        res.statusCode = 209;
        res.end('<form action="/login" method="post"><input type="text" name="username"><input type="password" name="password"><button type="submit">Login</button></form>');
    }else if(method === 'GET' && pathname === '/register'){
        res.statusCode = 209;
        res.end('注册')
    }else{
        res.end('Not Found')
    }

});

server.listen(8081,()=>{
  console.log('Server running on port 8081');
});
静态资源

let root = __dirname + '/page'; 网站根目录
let filepath = root + pathname; 请求资源路径

GET与POST请求
  • GET请求
    地址栏访问
    a链接
    link
    script
    video与audio引入多媒体
    img引入图片
    form标签method为get
    ajax中的get

  • POST请求
    form标签method为post
    ajax中的post

模块化

node.js实现了CommonJS模块化规范。

导出模块
  • module.exports
// 导出一个函数
module.exports = function(){
  console.log('hello')
}

// 导出一个对象
module.exports = {
  a: 1,
}
  • exports
exports.a = 1;
exports.b = 2;

exportsodule.exports的关系
exports 其实就是 module.exports = {}
module.exports可以导出任意数据,不可以使用exports = value的形式导出
require导入时返回结果始终是module.exports导出的值

导入模块
  • require()
    const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
    require.ensure() 是 webpack 特有的,已被 import() 取代。

  • 导入模块时的路径问题

  1. 自己创建的模块,使用相对路径,./../
  2. 导入js和json文件,可以不用写扩展名
  3. 导入其他类型的文件,会以js文件进行处理
  4. 导入路径是文件夹,首先检测文件夹下package.json文件中main属性对应的文件,如main属性不存在,或package.json不存在,或检测文件夹下的index.js和index.json
  5. 导入内置模块,路径使用模块名字即可。
  • 导入自定义模块基本流程
  1. 将相对路径转为绝对路径,定位目标文件
  2. 缓存检测
  3. 读取目标文件代码
  4. 包裹为一个函数并执行。通过arguments.callee.toString()查看自执行函数
  5. 读取模块的值
  6. 返回module.exports的值
CommonJS模块化规范
  1. 一个文件就是一个模块
  2. 一个模块就是一个对象
  3. 一个模块的顶层变量就是它导出的内容
  4. 一个模块的顶层函数就是它导出的内容
  5. 一个模块的顶层变量和函数只能在该模块内部使用
  6. 一个模块不能直接访问另一个模块的顶层变量和函数

相关文章

  • 说明

    nodejs基础

  • Node.js 安装

    基础安装 1、到 nodejs官网 https://nodejs.org[https://nodejs.org]...

  • nodejs基础

    NodeJs是什么 Node.js is a JavaScript runtime built on Chrome...

  • nodejs基础

    Buffer: 处理二进制数据 二进制数据的获取 文件数据 网络数据 二进制数据的可读性:base64 Base6...

  • nodeJS 基础

    Node.js 可以理解为能在操作系统上跑的js(不仅仅在浏览器) 还能当web服务器哟~ 用的Chrome V8...

  • nodeJS基础

    Node.js REPL(交互式解释器) Node.js REPL(Read Eval Print Loop:交互...

  • NodeJS基础

    一、基础 关闭服务器----------------查看对应服务器端口PID : lsof -i tcp 8989...

  • Nodejs基础

    Nodejs 定义:node是javascript的解析器,是javascript服务器的运行环境。 创建服务器v...

  • NODEJS基础

    Node的小基友supervisor 每次修改代码后会自动重启。懒程序员就指望这种省事省力的工具活着了:) 安装:...

  • NodeJS基础

    Installation 1. NodeJS安装 直接执行node程序,根据系统提示安装 如果没有安装node,a...

网友评论

      本文标题:nodejs基础

      本文链接:https://www.haomeiwen.com/subject/xwrqwdtx.html