1.什么是Node.js?
Node.js是一个基于"Chrome V8引擎"的JavaScript运行环境
2.ChromeV8引擎是什么呢?
V8引擎是一款专门解释和执行JS代码的虚拟机,任何程序只要集成了V8引擎都可以执行JS代码NodeJS不是一门编程语言,只是一个运行环境,就像windows,Linux,iOS等一样。由于集成了V8引擎,可以这个运行环境可以执行我们编写的JS代码。这个运行环境的最大特点是可以操作系统的底层API,通过这些API我们可以编写出网页中无法实现的功能
3.Global全局变量
__dirname:绝对路径的文件夹打印结果:/Users/cc/Desktop/web/Web2/10-Node
__filename:绝对路径的文件打印结果:/Users/cc/Desktop/web/Web2/10-Node
/05-js.js延迟执行setTimeout(callback, delay[, ...args])定时器setInterval(callback, delay[, ...args])
4. NodeJS开发中的模块NodeJS采用CommonJS规范实现了模块系统在Node.js模块系统中,每个文件都被视为一个独立的模块CommonJS规范CommonJS规范规定了如何定义一个模块,如何暴露(导出)模块中的变量函数,以及如何使用定义好的模块在CommonJS规范中一个文件就是一个模块在CommonJS规范中每个文件中的变量函数都是私有的,对其他文件不可见的在CommonJS规范中每个文件中的变量函数必须通过exports暴露(导出)之后其它文件才可以使用在CommonJS规范中想要使用其它文件暴露的变量函数必须通过require()导入模块才可以使用
定义一个07-a.js模块内容如下
let a =10;functionsum(c,b){returnc + b;}
// exports是一个对象
//暴露出去一个属性变量exports.a = a;exports.fn = sum;
b.js文件中导入模块
//导入a.js模块let obj = require("./07-a.js");
//打印 console.log(obj);let res = obj.fn(10,10); console.log(res);
*****暴露模块内部变量的方式有多种 1.通过exports.xxx = xxx导出
2.通过module.exports.xxx=xxx导出那么上述的a.js文件可以这样写
let name ="CC";functionsum(c,b){return c +b;}
//暴露给外面变量/函数module.exports.name=name;module.exports.fn=sum;
3.通过全局变量global暴露(不建议使用这个)
let name ="CC";functionsum(c,b){return c +b;} //暴露变量给外界global.str= name; global.fn = sum;
注意: exports 和 module.exports的区别
在导入变量的时候,exports不能是直接将变量赋值,这样在打印的时候的{},只能给exports对象添加一个属性变量赋值暴露
1.require导入模块时可以不添加导入模块的类型后缀文件名
如果没有指定导入模块的类型, 那么会依次查找.js .json .node文件 无论是三种类型中的哪一种, 导入之后都会转换成JS对象返回给我们 require可以导入"自定义模块(文件模块)"、"系统模块(核心模块)"、"第三方模块"
***包和包管理工具所谓的包:就是来维护多个模块之间的关系的模块前面说过就是一个单一功能的函数包管理工具NPM(NodePackageManager)NPM不需要单独安装,只要配置好Node.js环境,就会自动安装
npm install(i) -g 包名 安装包
npm uninstall -g 包名 卸载包
npm update -g 包名 更新包 (更新失败可以直接使用install)
npm init -> 初始化package.json文件
npm init -y -> 初始化package.json文件
npm install(i) 包名 --save
npm install(i) 包名 --save-dev
Path路径模块
封装了各种路径相关的操作需要手动投入这个模块//导入系统Path模块letpath=require("path");
1.获取路径path.dirname(path) let res2 =path.dirname("user/location/index.html");
//打印结果: user/location console.log(res2);
2.拼接路径path.join([...paths]) let str =path.join("/a/b","c");
//打印结果: /a/b/c3.path.resolve([...paths]):
3.用于解析路径// let res =path.resolve('/foo/bar','./baz'); // /foo/bar/baz // let res =path.resolve('/foo/bar','../baz'); // /foo/baz let res =path.resolve('/foo/bar','/baz'); // /baz console.log(res);
fs文件模块
需要手动导入才可以使用
//1.导入文件模块letfs =require("fs");
2.文件的读取fs.readFile(path[, options], callback)
异步方法fs.readFileSync(path[, options])
//1导入文件模块letfs =require("fs");
//导入路径模块letpath =require("path");
// __dirname绝对路径文件夹
// join拼接路径letfilePath = path.join(__dirname,"data.txt");
//2.读取文件fs.readFile(filePath,"utf8",function(err,data){//注意,如果第二个参数utf8不传递的话,返回的就是二进制数据//传递的话就返回的事-字符串if(!err){//读取成功后,获取的是二进制数据console.log("读取成功",data); }else{console.log("读取失败",err); }});
3.写入文件数据fs.writeFile(file, data[, options], callback)
异步方法fs.writeFileSync(file, data[, options])//导入文件模块letfs =require("fs");
//导入路径模块letpath =require("path");/
/拼接路径letfilePath = path.join(__dirname,"cc.txt");
//异步写入数据//参数一:写入的文件路径//参数二:写入的内容//参数三:编码方式//参数四:失败的回调fs.writeFile(filePath,"我是CC","utf8",function(err){console.log(err);if(err){thrownewError("写入失败"); }else{console.log("写入成功"); } });
//同步写入数据letfileSyncPath = path.join(__dirname,"Sync.txt");letres = fs.writeFileSync(fileSyncPath,"同步写入数据","utf8");console.log(res);
关于简单认识node.js模块化开发
模块化开发 传统非模块化开发有如下的缺点: 1、命名冲突 2、文件依赖
前端标准的模块化规范: 1、AMD - requirejs 2、CMD - seajs
服务器端的模块化规范: 1、CommonJS - Node.js
模块化相关的规则: 1、如何定义模块:一个js文件就是一个模块,模块内部的成员都是相互独立 2、模块成员的导出和引入
模块文件的后缀3种情况:.js .json .node 上述三种模块的加载优先级(不加文件后缀时的优先级):.js -> .json -> .node
导出 module.exports = { sum : sum, subtract : subtract }
引入 var mod= require('./01.js');
express模块
服务器相关
服务器:1,服务器是一台电脑 2,服务器软件(apach tomcat iis ngnix node) 3.服务器ip 和 端口号(80)
局域网:服务器通过网线(无线连接) 每个电脑都会有一个ip
外网:
ip:确定服务器主机的位置
port(端口):确定服务器里的某个程序
api接口的书写
接受数据
-- get req.query
-- post req.body 需要body-parser 插件进行解析
注意数据格式 json x-www-form-urencode formdata
中间件 multer
内置中间件 static
自定义中间件 (全局和局部)
第三方中间件 (body - parser)
在合适的地方执行next
静态资源目录 static (类似apache的www)
非关系数据库(文档) mongodb
1.下载
2.安装
处理异步的常用方式
promise asyc/awiat (es7)
promise //解决异步回调处理
封装的promise函数有两个参数(reslove,reject)并且会执行两个外部函数then和catch
执行reslove表示成功,外部会走then()函数;;执行reject表示失败,外部会走catch()函数
封装好promise后可以进行链式调用,只需要一个catch()