node.js

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命令。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值