博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2.node基础知识笔记
阅读量:4616 次
发布时间:2019-06-09

本文共 8664 字,大约阅读时间需要 28 分钟。

1.Node.js Buffer(缓冲区)

JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。

但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。

  • 实例化

    • Buffer.from(array)

    • Buffer.from(string)

    • Buffer.alloc(size)

  • 功能方法(静态方法:通过类名调用.)

    • Buffer.isEncoding() 判断是否支持该编码

    • Buffer.isBuffer() 判断是否为Buffer

    • Buffer.byteLength() 返回指定编码的字节长度,默认utf8

    • Buffer.concat() 将一组Buffer对象合并为一个Buffer对象

  • 实例方法

    • write() 向buffer对象中写入内容

    • slice() 截取新的buffer对象

    • toString() 把buf对象转成字符串

    • toJSON() 把buf对象转成json形式的字符串:

      不需要显式调用,当JSON.stringify()方法调用时会自动调用toJSON方法。

      let buf=Buffer.from('hello'); let json=JSON.stringify(buf); console.log(json);

2.核心模块API

先引入路径模块:

const path=require('path');

1. 路径操作:
  • [path.basename(path:返回文件名称

  • path.dirname(path):返回路径

  • path.extname(path):返回扩展名

  • path.format(pathObject):将一个pathObject转化为一个字符串路径

  • path.parse(path):将一个字符串路径转化为路径对象

  • path.isAbsolute(path):判断是否为一个绝对路径。

(2)blobal超全局对象下的两个方法:

  • __dirname:返回当前文件所在位置的目录;

  • __filename:返回当前文件所在位置的全路径.

 

  1. ​ // 拼接路径(..表示上层路径;.表示当前路径),在连接路径的时候会格式化路径 // console.log(path.join('/foo', 'bar', 'baz/asdf', 'quux', '../../')); ​ // 规范化路径 // console.log(path.normalize('/foo/bar//baz/asdf/quux/..')); // console.log(path.normalize('C:\\temp\\\\foo\\bar\\..\\')); // 计算相对路径 // console.log(path.relative('/data/orandea/test/aaa', '/data/orandea/impl/bbb')); // console.log(path.relative('C:\\orandea\\test\\aaa', 'C:\\orandea\\impl\\bbb')); // 解析路径 // console.log(path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif')); // 两个特殊属性 console.log(path.delimiter);//表示路径分隔符(windows是\ Linux是/) console.log(path.sep);//环境变量分隔符(windows中使用; linux中使用:)
  2. 异步与同步:

    于是,所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有等主线程任务执行完毕,"任务队列"开始通知主线程,请求执行任务,该任务才会进入主线程执行。

    js在浏览器中执行存在的异步操作: 定时任务 事件处理 ajax回调处理。

    node.js 中的异步执行任务:文件I/O 网络I/O

2.文件操作:
  1. 引入模块: const fs=require('fs');

  2. fs.stat(param1,param2)

    param1:文件路径 param2: 回调函数 ( err,stats)两个参数都为对象,stats.isDirectory:判断是否为路径

    stats.isFile:判断是否为文件。 属性:ctime:文件状态发生改变时间,如权限 mtime:数据改变时间 atime:访问时间 birthtime:文件创造时间。

return null3.readFile()和writeFile();

/*读文件操作*/ const fs=require('fs'); const path=require('path'); let strpath=path.join(__dirname,'data.json'); /*异步方式*/ fs.readFile(strpath,(err,data)=>{ if(err) return; console.log(data.toString()); }); /*同步方式*/ console.log(fs.readFileSync(strpath).toString()); /*写文件操作*/ let buf=Buffer.from('hello'); fs.writeFile(strpath,buf,'utf8',(err)=>{ if(!err){ console.log('写入成功'); } })

4.大文件的流式操作:

/*大文件的流式操作*/ const path=require('path'); const fs =require('fs'); let spath =path.join(__filename); let endPath=path.join('C:\\Users\\Administrator\\Desktop','file.js'); let readStream=fs.createReadStream(spath); let writeStream=fs.createWriteStream(endPath); /*基于事件的处理方式*/ /*let num=0; chunk:数据块 readStream.on('data',(chunk)=>{ num++; writeStream.write(chunk); }); readStream.on('end',()=>{ console.log('文件处理完成'+num); }); */ // pipe():直接将输入流连接到输出流 pipe:管道 readStream.pipe(writeStream);
3.目录结构:
/*目录操作*/ const path=require('path'); const fs=require('fs'); /*创建目录*/ // fs.mkdir(path.join(__dirname,'abc'),(err)=>{ // console.log(err); // }); /*同步创建目录*/ // fs.mkdirSync(path.join(__dirname,'def')); /*删除目录*/ // fs.rmdir(path.join(__dirname,'def'),(err)=>{}) //读取目录 fs.readdir(__dirname,(err,files)=>{ files.forEach((item,index)=>{ fs.stat(path.join(__dirname,item),(err,stat)=>{ if(stat.isFile()){ console.log(item+"文件"); }else if(stat.isDirectory()){ console.log(item+"目录"); } }); }); });
4.包:
  1. npm: node.js package management (全球最大的模块生态系统,也是node.js的包管理工具。)

  2. npm全局安装(安装包在node.js环境的modules目录下,一般用于命令行工具)

    • 安装包: npm install -g 包名称@版本 (全局安装) 本地安装则不需要 参数 g

    • 更新包 npm update 包名称

    • 删除包: npm uninstall 包名称

    • npm清除缓存:pm cache clean --force

3.npm本地安装:

​ 初始化包 npm init -y (1) 运行 node (2)指定pakage.json中test值 npm run test 执行

  • 添加依赖 : 开发环境 安装包的同时 末尾加上 --save

  • 生产环境:安装包的同时 末尾加上 --save-dev

  • 已有package.json中的dependencies 安装直接 npm install production

    已有DevDependencies 安装直接 npm install

4.yarn工具的安装:

​ yarn工具基本使用

安装yarn工具:npm install -g yarn ​ 1、初始化包 npm init yarn init 2、安装包 npm install xxx --save yarn add xxx 3、移除包 npm uninstall xxx yarn remove xxx 4、更新包 npm update xxx yarn upgrade xxx 5、安装开发依赖的包 npm install xxx --save-dev yarn add xxx --dev 6、全局安装 npm install -g xxx yarn global add xxx 7、设置下载镜像的地址 npm config set registry url yarn config set registry url 8、安装所有依赖 npm install yarn install 9、执行包 npm run yarn run

5.自定义包:

如果严格按照规范来说 包目录应包含以下文件或目录

  • package.json:包描述文件

  • bin:存放可执行二进制文件的目录

  • lib:存放js代码的目录

  • doc:存放文档的目录

  • test:存放单元测试用例代码的目录

5.node.js实现简单服务器:

(1)区别:

传统的动态网站开发需要应用软件 PHP : Apache + php模块 java :Tomcat 、Weblogic Node.js  : 不需要应用软件(可以自己实现)

(2)

/*简单实现服务器功能*/ const http=require('http'); // 创建服务器实例对象 let server=http.createServer(); /*绑定请求事件*/ server.on('request',(req,res)=>{ res.end('hello'); }); // 监听端口号 server.listen(3000); // 简单写法: http.createServer((req,res)=>{ res.end('welcome to this'); }).listen(3000,'192.168.229.1',()=>{ console.log('running...'); }); - 处理get方式请求参数: - ```javascript
  • 处理get请求方式参数:

    (1) const url=require('url'); (2) let param=url.parse(req.url,true).query

  • 处理post方式参数:

    1. const querystring = require('querystring');

    2. let pdata=''; req.on('data',(chunk)=>{ pdata+=chunk; }); req.on('end',()=>{ //定义一个存放post发送请求请求体内容的对象。 let obj=querystring.parse(pdata); })

 

  1. art-template的使用:

    /*art-template的使用*/ ​ var template = require('art-template'); /*第一种使用方法*/ /*var html = template(__dirname + '/mytpl.art', { user: { name: '汪龙', age:'18', hometown:"lantian" } }); console.log(html);*/ /*方法2*/ let tpl =`{ {if user}} 

    { {user.name}}

    { {user.age}}

    { {user.hometown}}

    { {/if}}'`; let tpl2=`
    成绩结果
    • 语文:{ {chinese}}
    • 数学:{ {math}}
    • 英语:{ {english}}
    • 综合:{ {summary}}
    `; let render=template.compile(tpl); let ret=render({ user: { name: '汪龙', age:'18', hometown:"lantian" } }); console.log(ret); // 方法3 let score= template.render(tpl2,{ chinese:'148', math:'149', english:'139', summary:'289' } ); console.log(score);
  • node.js web开发相关内容总结:

    1.nodejs不需要第三方软件,可以自己实现服务器功能。 2.实现静态资源分配 3.路由处理 4.动态网站 5.模板引擎 6.get和post参数处理 ​ web开发框架:express.
6.express框架:
  • 实现简单服务器测试

    /*express测试*/ const express=require('express'); const app=express(); let server=app.get('/',(req,res)=>{ res.send('hello world'); }); server.listen(3000,'localhost',()=>{ console.log('running...'); });
  • 静态文件托管:

/*托管静态文件*/ // 可以指定虚拟目录 // 可以指定多个目录 var express = require('express'); var app = express(); app.use(express.static('public')); app.use(express.static('www')); app.listen(3000,()=>{ console.log('running....'); });
  • 路由处理:

    /*路由(根据请求方式和请求路径进行路径分发处理)*/ /*  http常用请求方式:  1.get 查询 2.post 添加 3. put 更新 4. delete 删除 restful api(一种url格式) */ const express=require('express'); const app=express(); /*四种基本的路由请求方式*/ /*app.get('/',(req,res)=>{ res.send('get data'); }); app.post('/',(req,res)=>{ res.send('post data'); }); app.put('/',(req,res)=>{ res.send('put data'); }); app.delete('/',(req,res)=>{ res.send('delete data'); });*/ // 直接使用use可以处理所有的路由请求分发 app.use('/',(req,res)=>{ res.send('hello'); }); app.listen(3000,()=>{ console.log('running....'); });
  • 中间件(就是处理过程中的一个环节(本质上相当于一个函数)):

​ // 中间件的挂载方式// use 路由(get post put delete);// next('route');跳转到下一路由

const express=require('express'); const app=express(); let acessNum=0; //监听所有路径 app.use('',(req,res,next)=>{ /*记录访问时间*/ console.log('哈哈,你怎么又来看我了'); next() }); app.use('/user',(req,res,next)=>{ /*记录访问时间*/ console.log(Date.now()); next() }); app.use('/user',(req,res,next)=>{ /*记录访问日志*/ console.log('welcome to this'); next() }); app.use('/user',(req,res)=>{ /*记录访问次数*/ acessNum++; console.log('访问量:'+acessNum); res.send('hello'); });
  • 应用中间件:

    //登录验证 /*中间件的应用,第3方中间件,body-parse的使用*/ const express=require('express'); const app=express(); const bodyParser = require('body-parser'); // 托管静态资源 app.use(express.static('public')); // 处理get请求方式参数 //挂载body-parser中间件 app.use(bodyParser.urlencoded({ extended: false })); //当data为json格式的时候需要加载下面代码 //app.use(bodyParser.json()) app.get('/login',(req,res)=>{ // 通过req.query属性获得get方式参数 let data=req.query; if(data.username=='admin'&&data.password=='123'){ res.send('success'); }else{ res.send('failure'); } }); //处理post请求、 app.post('/login',(req,res)=>{ let data=req.body; console.log(data); if(data.username=='admin'&&data.password=='123'){ res.send('success'); }else{ res.send('failure'); } }); app.listen(3000,()=>{ console.log('running....'); });
  • express中使用art-template模板:

    1.安装包:

    npm install --save art-template npm install --save express-art-template

    2.使用:

    // 设置模板的路径 app.set('views',path.join(__dirname,'views')); // 设置模板引擎 app.set('view engine','art'); // 使express兼容art-template模板引擎 app.engine('art', require('express-art-template')); // 参数一:模板名称;参数二:渲染模板的数据 res.render('list',data);

转载于:https://www.cnblogs.com/buautifulgirl/p/9834498.html

你可能感兴趣的文章
异常处理
查看>>
/proc/uptime详解
查看>>
如何建立合适的索引?
查看>>
acwing 651. 逛画展
查看>>
Vijos P1243 生产产品 (单调队列优化DP)
查看>>
iOS常用第三方库 -转
查看>>
Android布局学习
查看>>
python的沙盒环境--virtualenv
查看>>
软件自动化测试——入门、进阶与实战
查看>>
BZOJ1878 [SDOI2009]HH的项链 树状数组 或 莫队
查看>>
BZOJ3675 [Apio2014]序列分割 动态规划 斜率优化
查看>>
2016.10.24 继续学习
查看>>
产品功能对标 - 服务授权管理
查看>>
各地IT薪资待遇讨论
查看>>
splay入门
查看>>
带CookieContainer进行post
查看>>
C语言学习笔记--字符串
查看>>
CSS-上下文选择器
查看>>
ionic repeat 重复最后一个时要执行某个函数
查看>>
1.初识代码审计-基础
查看>>