文章目录
node安装
win+R :
node -v :node版本号
npm -v:npm版本号下载功能模块的工具 迅雷,采用的外国服务器,也就是npm下载的资源都是从国外下载,导致速度比较慢
修改npm下载源,改为淘宝镜像下载源 npm install -g cnpm --registry=https://registry.npm.taobao.org
cd C:\Users\机械革命\Desktop\node 进入这个文件夹
cd.. 返回上一层
E:, 切换盘符;
npm init ---改成nodejs项目
npm init -y 一直回车
npm install 安装某个模块
npm install file -s -save把安装的某块写进依赖项里面,可以在pageage.json看到安装的模块
ctrl+c 终止命令
cls 清除屏幕;
cnpm install multer -s 使用cnpm淘宝镜像装
npm node package module:node包模块
在使用完npm install之后多出一个文件夹node_modules,所有的某块下载之后就会存在这个文件夹里面
package.json:项目的配置信息,
模块化
通过script标签引入的js,存在命名空间冲突的问题,并且有先后顺序;模块就很好的解决了这个问题;
什么是模块化?
把一个整体的功能分化成一个个小功能,每一个小功能有时相互不影响的,这时候可以把一个小功能写进一个模块了,最后把每个模块进行合并,实现整体的功能;
node.js 提供的模块化标砖采用的是了commonjs模块化;
另外还有es6模块化标准;
现在主流的浏览器并不支持模块化的运行环境,只能在node.js中运行;
在node.js中不能使用dom对象和页面相关的操作,如alert() 全局中的this指向的是module.exports;(实验指向空对象) 在函数中对象变成了global;
自定义一个模块
在node.js中 每个js文件都是一个模块,只需要module.exports 将对象或者函数导出,就可以在其他页面加载此模块;
导出本地模块:module.exports={
key:data
}
加载本地模块: var module=requrie("文件路径或者模块名") //可省略js;如果没写地址,则node会在node_modules文件夹里面寻找模块;
加载模块
安装的模块会被作为依赖项写入项目的配置文件package.json中。
当在nodejs中导入一个模块时,如果是第三方模块,则会在项目的node_modules中寻找这个模块(文件夹),
然后导入这个模块中的入口js文件,package,json中会规定模块入口文件的名字,如果没有规定则默认为index.js
requrie(“模块名或者模块地址”); 如果没写地址,则node会在node_modules文件夹里面寻找模块;
内置模块
node.js为我们提供了一些一些内置模块,如fs,http, path,url,
同时我们也可以在在npm中加载我们所需要的模块,如express,multer,mongoose;
fs模块
在nodejs中,文件的操作都需要fs模块来实现, fs模块包含了几乎所有的文件加载,读写,创建,删除;在fs模块中
所有的方法都分为同步和异步两种,区别就是在尾部添加Sync(同步的意思)就能实现一个同步方法 在所有异步执行中,
都有一个回调函数,回调函数都会有一个err参数,返回错误,如果没有错误,返回null;
readFile() //为一个文件写入数据(重复写入会覆盖里面的内容),如果没有该文件,创建一个文件;参数以文件地址,参数二写入的文件数据buffer类型或者String; 参数三回调函数;
copyFile() //拷贝写入,(会覆盖里面原内容) 如果写入文件不存在,则会创建一个文件;
appendFile() //追加写入,不会覆盖里面的元素,如果没有该文件,则会创建一个文件, 参数一文件的地址,参会二文件的数据Buffer和字符串;
writeFile() //读取一个文件的数据,返回一个buffer类型的二进制流数据,通过tostring()方法可以转换成字符串; 参数一文件路径,参数二回调函数,回调函数中有两个参数err,data;
unlick() //删除一个文件,参数一要删除文件的地址,参数二回调函数:
mkdir() //创建一个文件夹,参数一,文件夹需要创建的位置,参数二回调函数;
rmdir() //删除一个空的文件夹 非空请使用递归删除里面文件在删除文件夹;
readdir() //读取一个文件夹,返回文件夹中所有文件的名称数组;参数一文件的地址,参数二文件的options,编码格式,参数三回调;
open() //打开文件,暂时不知该其功能;
close() //关闭文件;
read() //读取文件,与readFile不同的时当文件过大或者文件不知道多大时,分多次写入buffer中;
总结:fs中同步执行代码会阻塞代码,但是异步函数多为回调函数,不好维护,推荐使用async和await方法解决;
http模块
nodejs内置的模块,帮助搭建一个服务器;
var app= http.createServer(function(req,res)) //创建一个wab服务器 参数是一个回调函数,参数为res和req 请求报文和相应报文;
req.url 获取请求的数据;("字符串") /api/?age=30&name="dd' 得到端口号之后的字符串
res.json() //返回json数据;
res.end() //结束响应; 将数据返回到前端,返回的数据要是html元素,则会返回一个页面;
res.setHeader() //设置响应头 ;为一个隐式的响应头设置值。 如果该响应头已存在,则值会被覆盖。 如果要发送多个名称相同的响应头,则使用字符串数组。
req.writerHeader() //发送一个响应头给请求; 状态码是一个三位数的 HTTP 状态码,如 404。 最后一个参数 headers 是响应头。 第二个参数 statusMessage 是可选的状态描述
app.listen() //监听8080端口 参数一设置端口号 参数二回调函数;
path模块
__filename //获取当前文件的路径;
__dirname //获取当前文件夹的路径;
parse() //将一个路径转化成一个对象 该对象包含的属性有 文件名字.ext,文件的名字 .name;文件夹的路径.dir 等;
.ext //文件后缀名
.name //文件名字
.base //文件名加后缀;
.dir //文件夹的路径
jion() //将路径合并后返回一个新路径;
extname(__filename) //获取当前文件路径的后缀名;
...与parse对象的键值相同的功能;
url模块
url的结构是:协议名 ip地址 端口号 路径 查询字段 哈希值;
parse("url") 将url转化成对象;
.protocol //协议名
.hostname //域名
.host //域名+端口号
.port: //端口号
.search //查询字段(带?);
.query //请求参数 (不带? 利于分割字符串&);
.pathname: //文件路径
.path //路径和查询字段;
.hash //哈希值
.href //完整的url
静态文件夹:
如果服务器有一些静态资源,需要访问,例如图片,html页面,css,可以通过网络访问请求静态资源;
静态资源:一般有客户端发送请求到web服务器中,服务器将文件返回到客户端中,客户端在渲染出来;
动态资源:一般客户端请求的动态资源,先将请求交于web容器,web容器连接数据库,数据库处理数据之后,将内容交给web服务器,web服务器返回给客户端解析渲染处理。
怎么完成静态文件夹;
不使用模块:
原理:通过http创建一个web服务器,在通过req.url找到请求数据的文件和后缀名,在读取数据将页面返回到客户端;
使用express模块
app.use(express.static(“www”)); 就完成了静态文件夹,直接返回文件夹里面的index文件;
当我们输入服务器地址的时候,会直接访问www文件夹下面的index页面;
os模块 //处理本机设备被的一些信息模块;
express模块
express模块三大核心概念:路由,中间件,模块引擎;
express 是基于http模块开发的模块,极大的简化了web服务器的应用开发
帮助我们快速搭建服务器,设置静态文件夹,封装服务区功能等接口并且也提供了很多中间件;
创建web服务器;
var app=experss()
app.use(express.urlencoded({extended:false}))
app.listen(port,fun);
响应报文的操作
res.json() //返回json数据;
res.send() //返回字符串或者页面;
res.render() //返回一个页面模板,从本地文件读取 参数一 文件的文件名称(文件夹已经通过set设置过了,此时不需要在添加了;
参数二 传输到模板引擎的数据,必须是一个对象,在模板引擎里面可以直接使用;
res.location() //重定向,只能指定位置;
res.redirect() //重定向,参数为1为重定向的状态码,参数二位重定向的位置;(加上文件路径可以访问文件 如 /index.html);
req.ip //获取请求数据的ip地址;
四种不同处理方法:
app.use(experss.json(option)) //处理jsons数据;
app.use(experss.raw(option)) //处理Buffer数据流;
app.use(experss.text(option)) //处理文本数据;
app.use(experss.urlencoded(option)) //处理UTF-8编码的数据;
创建静态文件夹
app.use(experss.static("path"));
UTF-8的编码的数据
app.use(express.urlencoded({extended:false}))
//extended :false 使用系统模块querystring来处理,也是官方推荐的
//extended:true //使用第三方模块qs来处理,从功能来讲,qs比querystringg更为强大,所以根据项目需求来选择;
接口;
app.get() //get方式的接口,参数一请求的路径,参数二回调函数;
...
中间件
需要对多个请求在响应之前需要进行统一的操作,例如post请求的数据,需要通多body.parse进行解析;
使用logger模块,或者cookie-parse, static,等都是一个中间件;本质就是一个函数;
next() 把本次请求交给下一个中间件处理,客户端发起请求之后,服务器把我们的请求交给一些些中间件进行处理,直到把我们的请求去交给
res.end() res.send() 这样的接口里面,本次请求才会结束;
app.use(function()) 整个服务器的接口全部引用中间件操作,也可与单独设置中间件,在get|post函数中的第二个参数可以写入我们的中间件或者自定义的中间件;
在中间件中,一般错误的中间件写在最后,因为只有所有的中间件全部处理之后,才会执行错误中间件;
我们也可以自定义一个中间件,因为中间件的本质是函数,所以我们只需要创建一个特殊的函数就可与自己创建一个中间件;
function middleWare(req,res,next){
//处理程序;
next() //将本次请求交给下一个中间件或者响应函数;
}
get("/",middleWare,function(req,res,next){}) //本次请求需要 先经过middleWare这样的一个中间件进行处理,处理完之后,如果走了next函数,把请求交给本次
这样我们就可与自定义一个中间件了,在使用这个中间件,只需要在响应函数的第二个参数添加这个中间件或者使用app.use() 全局添加 (不能写()直接写函数名,写()直接调用),
-------------------
body-parser //引入body-parser模块,为了解决post传递的数据,可以通过req.body来获取数据,因为是内置模块,所以可以不用引用;
模板引擎
模板引擎是为了用户界面与数据相互分离而产生的,业务代码和逻辑代码相分离,大大提高开发效率,但现在来说,更注重于ajax技术;
注意事项:页面中如果有静态文件夹,则必须将静态文件夹取消,模板引擎于静态文件夹只能保留其一;
ejs 模板引擎
ejs常用标签
<% %> //流程控制语句;
<%= %> //原文输出语句;
<%- %> //输出语句,会被html解析;
<%# %> //添加注释;
% //标记进行转移;
-%> //去掉没用的空格;
app.set("view engine","ejs") //设置引擎;
设置get请求,参数为"/" 在get请求里面 响应数据返回数据使用res.render(); 参数如下
参数一 文件的文件名称(文件夹已经通过set设置过了,此时不需要在添加了)
参数二 传输到模板引擎的数据,必须是一个对象,在模板引擎里面可以直接使用;
路由
把功能相似,url中只有path不同的api写在同一个文件夹里面,减少入口文件的代码量,返回不同的页面,就叫路由;
好处:利于代码的维护和封装;
var router=exprese.Router() //创建一个路由;
app.use(“路由公共地址”,reoter) //把路由添加到服务器中; 参数一地址,参数二创建的路由;
三种实现方法;
第一种 在入口文件中创建路由,通过在入口文件设置路由打点调用get()设置api;
不推荐,因为入口文件的代码量还是繁重;
第二种:提取公共样式,有很多api接口url除了path同外,大部分都相同,所以相同的部分可以设置在
use()里面,这样 就减少很多不必要的代码了
第三种:创建router文件夹,创建模块导入到入口文件,使代码更加简介,利于维护;
app.use('/login',require("./routers/login.js")); 前面是提起公共样式,后面引入模块;
"/delete/:id" //: 这种参数属于通配符,在次数可以写任意数据来替代"
怎么获取这种数据
req.params.id 获取通配符的数据;
buffer对象
buffer对象Node处理二进制数据的一个接口。它是Node原生提供的全局对象,
然javascript对于字符串的操作十分友好。但是,在node中,很多的操作都会处理大量的二进制数据,
比如文件处理,网络协议处理,图片处理。javascript自有的字符串远远不能满足这些要求,于是Buffer对象应运而生。
Buffer是一个典型的javascript和c++结合的模块,它将性能相关的部分用c++实现,而将非性能相关的部分用js实现。
内存分配
buffer对象内存分配不是在V8的堆内存中,而是在node的c++层面实现的内存的申请的。node采用了slab分配机制,动态内存管理,
slab包含三种状态,slab具有如下三种状态:
full:完全分配状态
partial: 部分分配状态
empty:没有被分配状态
我们可以指定Buffer对象的大小
Buffer.alloc(0) //创建buffer对象,长度为0
concat() //拼接buffer对象;
on("data",function(data)) //监听数据传递事件,data是每次传输的量,会传输多次;
on ("end",function()) //数据结束时调用事件;
关于数据储存方式
1 使用变量,对象,数组等储存在内存中,等面关闭或者跳转,都会清空里面的数据
2 储存在服务器文件夹或者数据库,cookie 和localstroage存在浏览器,(存储数据较小);都可以持久化保存;
使用http模块发送请求,
使用nodejs发送请求向服务器请求数据,也可以向第三方发送数据;
核心 http模块的request() 发送请求 ;
参数一 options|url 可以时配置对象,也可与直接写url串;
参数二 回调函数 回调函数中res对象;
因为响应的数据时二进制流,所以只能监听数据的传递的传递,本身会调用很多次才能将数据全部传递;
res.on("data") 是个异步的方法,所以配合on("end")来获取数据;
on("data",function(chunk){
str+=chunk;
});
on("data",function(data)) //监听数据传递事件,data是每次传输的量,会传输多次;
on ("end",function()) //数据结束时调用事件;
最后在底部结束本次请求
post请求需要将数据添加 req.write(data)
requset.end();
关于http服务器一些操作
ico报错 解决办法
if(req.url.includes(".ico")){
retuen res.end();
}
req.on("data") //发送请求的过程,可能会执行多次;
// encodeURIComponent("#") %23 //编码,将url中的特殊字符进行转码;
// decodeURIComponent("%23") # //解码 将转码之后的进行转码;
cheerio 模块
cheerio 模块可以让nodejs操作dom元素 是jquery核心功能的一个快捷灵活而又简洁的实现;
var $=cheerio.load(“html”) //加载html元素标签;
接下来就可以使用jquery的语法操作dom元素了
request 模块 发送请求的模块,与cheerio模块可以组合出爬虫的效果;
request("url",function(err,res,body)) err 错误信息,res 响应报文 body 响应数的主体;
res.staticCode //响应的状态码;
res.body //响应数据的主体;
我们可以得到响应主题,是一个html字符串,配合cheerio模块,就可以使用jquery语法爬取数据;
var $=cheerio.load(res.body);
phantomjs 模块
它是一个无头,无界面,使用脚本操作的浏览器,可以进行爬虫操作,模拟登录操作,以爬取需要登陆的网站;
在node.js中使用的方式;
先下载phantomjs模块,在依赖项里面script写入指令 “start”:“phantomjs index.js” //使用phantomjs运行index,js;
在页面中导入webpage模块,此模块是为了创建一个页面的实例对象 为了使用页面实对象phantom的api;
var page= webPage.create() //创建一个页面实例对象;
page.open("url",function(static)) //打开一个页面;
static 有两个值,当为success运行成功,为fail运行失败;
if(static=="fail"){
page.close() //关闭页面
phantom.exit() //退出Phantom的执行命令;
retuen
}
page.cookies //页面中的所有cookies数据
page.title //页面标题;
page.render("图片名称.png") //截图;
文件上传和下载
multer 这个中间件用来处理客户上传的各种文件并且保存到服务端;
使用方法;注意:上传文件需要使用formData对象,所以需要使用post请求;
var upload= multer({dest:"文件路径/"}) //指定配置项,这里指定文件保存于当前目录下的upload子目录;
res.post("/up",upload.single("inputName"),function) //运用中间件,并且指明文件名,此名需要同input type=flie 的文本框的name的文件名一致,否则会报错;
res.post("/up",upload.array("inputName",num),function) // array() 可以一次上传多个文件; input 需要设置multiple属性上传多个; num设置最大上传个数;
var upload=multer({
storage: multer.diskStorage({ // storage使用硬盘储存方式; diskStorage 配置使用硬盘储存的配置对象;
destination:function(req,file,callback) //设置保存在磁盘的路径;
filename:function(req,file,callback) //设置保存的文件名;
})
})
router.post("/",function(req,res){
req.file //传输文件的文件信息;
req.file.path //保存的地址路径(相对的路径) 可用于返回文件地址,拼接上域名;
})
服务器下载
request("https://ww4.sinaimg.cn/bmiddle/d4aca772ly1gp4324vsikj20ku0jzgxu.jpg") //requset 请求模块
.pipe(fs.createWriteStream("pudata/up/土拍你.jpg")) //把目标的可以读写数据流作为参数
.on("close",function(){ //文件结束时响应;
res.end("6315");
})
express
npm install express-generator -g //全局安装快速搭建脚手架
express项目生成器,是一个nodejs程序,可以快速搭建一个express项目。
使用命令:
express [项目名] --view=ejs
项目根目录下有4个自带的文件夹
bin:存放项目源代码的文件夹。
public:项目静态文件夹。
routers:存放路由的文件夹。
views:存放模板的文件夹。
创建的项目中没有node_modules文件夹,但是在package.json中写好了依赖项,所以创建完项目之后需要先npm install 安装依赖项。
运行项目的命令是 npm start
npm xxxx,如果xxxx不是npm自带命令,就在当前项目的package.json中的script中寻找这个命令并执行。所以npm start执行的就是package.json的script中的start命令。