目录
node 是什么?
- node.js 是一个基于Chrome v8 引擎的 JavaScript 运行环境。
- 运行环境:指代码可以正常运行所需要的必要环境。
- 前端开发:js在浏览器中运行
- 后端:js在node服务器中运行
node 可以做什么?
- 基于Express框架,可以快速构建web应用。
- 基于Eletorn 框架,快速构建桌面应用。
- 可以读写数据库
- 操作系统文件
- 爬虫
- 命令行工具
node 学习重点:
- 语法
- 内置API
- 第三方api模块(Express 、MySQL)
终端运行Js文件: node js文件路径
常用的终端快捷键语句
- 进入目录: cd 目录名
- 跳出当前目录: cd ../
- 清屏: csl
- 上下键:切换命令历史记录
- 清空当前输入的命令:esc
模块的分类
-
内置模块 :node官方提供的模块
引入格式 : require("模块名");
不成文的规范:将引入的模块赋值给一个变量,变量名与文件名相同
fs 模块 (官方提供),用于操作文件
它提供了一系列的属性和方法,用于满足用户对文件的操作需求。
【注意:】使用前一定先引入模块:
var fs =require("fs")
1.读取文件:readFile ( path [,option] , callback )
- path :必选,读取的文件路径
- option : 可选,配置编码等信息;
- callback :读取之后的回调哈桑农户,回调函数中有两个参数 : err(错误信息) 和 data(读取的数据)
{ 如果读取成功, err 的值为null
如果读取失败:err的值为错误信息对象。data 为undefined}
var fs =require("fs"); fs.readFile("./a.js","utf-8",(err,data)=>{ if(err){ console.log("报错信息:"+err); //如果读取错误,打印出报错信息 return; } console.log(typeof data); });
2.写入文件:
writeFile(path , data , 字符集 , callback函数) 会覆盖原来的内容
- path :必选,写入的文件路径 (若指定路径中文件不存在则会在该路径中创建文件,但若路径为找到,则报错)
- data: 要写入文件中的内容
- 字符集:utf-8;
- callback 方法执行后的回调函数,该回调函数只有一个参数:err 表示错误信息。
3.追加文件:appendFile(data[, options])使用方法与writeFile相同
4.删除文件:unlink(path , callback)
- path :必选,要删除的文件路径
- callback 方法执行后的回调函数,该回调函数只有一个参数:err 表示错误信息。
5.创建文件夹:mkdir(路径,callback) 回调函数如果出现错误,可以用err参数接收
6.重命名:rename(需要修改名字的文件路径 , 新文件名,callback)
路径问题
node 中,使用相对路径会存在一定的问题:当我们不在js所在目录下打开命令行时,执行js文件,相对路径不是相对js文件,而是相对命令行打开的目录
__dirname : 当前文件所在目录的绝对路径 (运行的js文件的所在上级目录)
但是字符串拼接路径不够灵活 —— 采用path模块的jion()方法更加灵活
path 模块
包含一系列的处理和转换文件路径的方法
导入模块:require(“path”);
在不同的操作系统下路径分隔符不同,window 下是 / \\ ;linux 是/
- 获取路径文件的扩展名 :extname(路径)
- 返回路径中的最后一部分: basename(路径,【ext】) (如果ext 不为空,则返回的是不包含扩展名文件名,否则返回包含扩展名的文件名)
- jion(路径1,路径2,... ) 路径以字符串的形式拼接,支持多个参数实现字符串连接
let path = require("path"); var fpath = path.join(__dirname,url); //url 表示需连接的目录字符串
-
自定义模块: 开发人员定义的模块
- 在node下,每个js文件中都有一个module对象,
- 该对象下有个export属性 (默认为空对象)
- 导出:module.exports.属性名 = 属性值
- 导入:require("自定模块路径【.js文件后缀可省略不写】")
外界使用require方法导入自定义模块时,得到的就是module.exports指向的对象
【注意】
1.使用require引入模块是,会执行该模块下的代码
2.模块是有缓存的,多次导入只会执行一次
module.exports 和 exports的区别
共同点:
- 都是用来导出成员。
- 默认情况下,module.exports 和exports 指向的是同一个对象
- 区别:
- exports 导出右边不能直接赋值一个对象,但是module.exports 可以。
- 两者同时使用时,如果指向的对象不是同一个,以module.exports wei'zhun
-
第三方模块:由第三方开发,使用前需要下载
npmjs.com 第三方模块仓库
模块作用域
在自定义模块中的变量,函数,对象等成员,只能在模块中使用,模块级别的访问限制称为模块作用域。
Node的艺术:art-of-node/readme.zh-cn.md at master · maxogden/art-of-node · GitHub(node 的工作原理解析)
node服务器
前言导入:
请求:客户端给服务端发送数据
响应:服务端返回给客户端相应的请求数据
在开发过程中,客户端(前端一般指的是浏览器)和服务端(一般会安装web服务器软件,如:Apache等)
但是在node中,可以直接通过http内置模块,轻松搭建服务器。
引入模块:
let http = require("http")
- 创建服务器对象 /实例:createServer(callback(request,response){}).listen(端口号,启动成功后的回调函数) 方法
- 回调函数参数一:request:客户端请求信息对象
- 回调函数参数二:response:服务器响应信息对象;{使用end()方法, write()方法 ,将内容响应给客户端 (write()方法可多次调用,但是end()只能调用一次,后面就不能调用响应方法end()或write()),}
- 服务器对象.listen(端口号,callback)服务端启动必须添加端口监听
【注意】:只要js文件发生了改变,就需要重启服务器,才能将修改后的文件生效。
let fs = require("fs"); let http =require("http"); let path = require("path"); http.createServer((request,response)=>{ response.setHeader('Content-Type','text/html;charset=UTF-8;'); var url = request.url; if(url == "/"){ url = "/buycarV3.html"; } var fpath = path.join(__dirname,url); fs.readFile(fpath,"utf-8",(err,data)=>{ if(err){ respond.end("报错信息为:"+err); return; } response.end(data); console.log("页面加载成功"); }); }).listen(3000,()=>{ console.log("服务器启动成功"); });
路由
根据客户端的请求方式和请求路径不同,响应不同的资源(内容)
请求路径:
请求对象 request中url属性中存储着请求对象的路径(端口号后面的内容)
请求方式:
- get:
- post:
响应内容中文乱码问题:
服务器创建时,设置响应信息对象
respond.setHeader('Content-Type','text/html;charset=UTF-8;');