美文网首页
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基础

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