nodejs基础

2023-11-12  本文已影响0人  渚清与沙白

Buffer

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

  1. 大小固定,无法调整
  2. 性能好,可以直接操作内存
  3. 每个元素大小为1字节
  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>
  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)

路径

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请求

模块化

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

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

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

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

导入模块
  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. 一个模块不能直接访问另一个模块的顶层变量和函数
上一篇下一篇

猜你喜欢

热点阅读