1. NodeJS
- NodeJS(node.js)是JavaScript运行环境.
- 安装成功后可以直接通过浏览器访问JavaScript代码。
- 作用:typeScript;让 JavaScript 成为与PHP、Python 等平起平坐的语言;前段脱离后端,直接通过JS写项目。
- 下载的地址:
- 官 网:nodejs.org
- 中文网址:nodejs.cn
- 学习社区:cnodejs.org
- 相关工具:
- nvm工具:实现nodejs任意版本切换
- npm工具:下载nodejs所需模块(工具库)
2. JS的安装和使用
根据电脑配置在官网下载安装包,安装过程中唯一需要注意的就是选择安装目录
安装完毕之后进行测试,在cmd中(尽量使用以管理员的身份运行)输入node -v显示版本号
- 在工作路径下可直接调用js输出结果
3. 模块系统
-
使用NodeJS编写应用程序主要使用
- ECMAScript语法:变量、判断、循环等(JS三大组成部分:ECMA/DOM/BOM)
- 内置/核心模块:http服务、fs文件操作、url路径、path路径处理、os操作系统
-
CommonJS模块规范
- 一个文件就是一个模块
- 通过require来加载模块
- 通过exports和modul.exports来导出模块中的成员(声明模块中哪些功能可以使用)
自定义node.js模块
//声明模块
//写法1
exports.属性/方法名 = 功能
//写法2
module.exports.属性/方法名 = 变量名;
//使用:先引入再调用
var 对象 = require(‘路径及文件名’);
//对象.属性或方法名;
举例:创建a.js和b.js文件,在b.js引入a.js模块
//a.js内容
function add(){
console.log('this is add');
}
function edit(){
console.log('this is edit');
}
function del(){
console.log('this is del');
}
// 使用exports进行导出
exports.add = add;
exports.edit = edit;
exports.del = del;
exports.say = 'hello';
//b.js的内容
//引用a
var b=require('./a');
//将say的值改为hello
b.say = 'world';
console.log(b);
-
exports和module.exports的区别
上述a.js的导出可写为:
// 使用exports进行导出
module.exports.add = add;
module.exports.edit = edit;
module.exports.del = del;
exports.say = 'hello';
区别:exports和module.exports是同一个对象;但exports仅仅是module.exports的一个地址引用;nodejs只会导出module.exports的指向,如果exports指向变了,那就仅仅是exports不在指向module.exports,于是不会再被导出。
4. npm工具使用
npm是一个命令行工具,是英文node package manager的缩写,下载node所需第三方模块;安装NodeJS自带npm所以不用重新安装,直接使用。
-
npm的命令(都是在cmd中运行)
- 查看已安装的:npm list
- 安装:npm install [模块 或 模块@版本号] [安装可选参数]
- 卸载:npm uninstall [模块]
-
安装可选参数
- --save 记录生产环境所需模块(默认)
- --save-dev 块版本信息保存到devDependencies(开发环境)
- -g 全局命令;该模块可在命令行(cmd中)运行(global)
-
代码的运行环境:生产和开发
- 生产:项目上线正常运行使用的环境;生产环境的包如果遇到了代码错误,只会终止代码执行,不会报明确的错误。
- 开发:写代码实现功能时,使用的环境;开发环境下,代码错误就会明确的指出错误的原因和地址。
5. npm安装mime模块
MIME是一个规则,类型text/html - .html文件、image/png- png文件等;安装mime模块,则该模块用户可判断文件mime类型
-
运行cmd到所需要的工作目录,使用如下代码进行初始化
npm init -y
会在工作目录下生成package.json项目描述文件
// name - 包名.
// version - 包的版本号。
// description - 包的描述。
// homepage - 包的官网URL。
// author - 包的作者,它的值是你在https://npmjs.org网站的有效账户名,遵循“账户名<邮件>”的规则,例如:zhangsan <zhangsan@163.com>。
// contributors - 包的其他贡献者。
// dependencies / devDependencies - 生产/开发环境依赖包列表。它们将会被安装在 node_module 目录下。
// repository - 包代码的Repo信息,包括type和URL,type可以是git或svn,URL则是包的Repo地址。
// main - main 字段指定了程序的主入口文件,require('moduleName') 就会加载这个文件。这个字段的默认值是模块根目录下面的 // index.js
// keywords - 关键字
-
使用如下代码安装mime
npm install mime
创建mime.js测试,获取文件的类型——文档:https://www.npmjs.com/package/mime
//引入mime
var mime = require('mime');
//定义文件
var file = 'cc.png';
//获取图片的后缀
var imgType = mime.getType(file);
console.log(imgType);
//获取图片所属mime类型
console.log(mime.getExtension(imgType));
-
报错情况
使用-g安装为全局命令,否则在cmd命令行里直接运行 mime aa.jpg 会报错
需要使用uninstall来写在mime包,加上-g后重新安装
6. NPM源管理
- 安装nrm命令——npm install nrm -g
- 使用命令查看可用服务器——nrm ls
-
使用命令更换服务器——nrm use [服务器名字]
nodejs03.png
7. npm自定义命令
当后期项目较大时可以用一条命令进行启动;仅需要修改package.json中的scripts进行启动;
//package文件中会有如下一个模块
//通过npm命令行启动mime.js,相当于配置了快捷方式
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start":"node mime.js"
},
因此,在cmd中使用代码:npm run start即可运行,start 命令就是package.json启动项目的命令;
其中的run:npm run是npm run-script的简写,顾名思义就是执行脚本。执行的脚本配置在package.json中的scripts对象;
8. nodemon自动重启服务
我们发现,每次修改js代码都得重新启动服务才能读取变化,非常的不方便,因此可通过nodemon检测文件修改自动重启;
-
安装nodemon——npm install nodemon --save-dev -g
指定安装开发环境且配置为全局
-
通过nodemon启动服务 -> 测试
例如在cmd中输入nodemon test.js
9. http模块
Node中提供了http模块,其中封装了高效的http服务器和http客户端 http.server是一个基于事件的HTTP服务器,内部是由c++实现的,接口由JavaScript封装 http.request是一个HTTP客户端工具。用户向服务器发送数据。
手册:https://www.nodeapp.cn/http.html#http_http_createserver_requestlistener
-
http模块中常见的方法
createServer() 返回新建的http.Server实例。
server.on('request',function(){}) 监听客户请求
server.listen() 启动 HTTP 服务器监听连接.
reponse.write() 给客户端响应数据
response.end() 结束响应
-
创建http服务器:
- 新建http.js文件,写入服务器代码,监听客户请求
// 1 引入http模块
var http = require('http');
// 2使用createServer创建一个服务器
var server = http.createServer();
// 3 监听用户的请求,凡是xxx事件,都可以使用on绑定
server.on('request',function(request,response){
console.log('客户的请求收到了!');
});
// 4 启动服务器
server.listen(8080,function(){
console.log('服务器已经启动,可以访问8080');
});
-
监听到客户请求之后进行响应
// 1 引入http模块 var http = require('http'); // 2使用createServer创建一个服务器 var server = http.createServer(); // 3 监听用户的请求,凡是xxx事件,都可以使用on绑定 server.on('request',function(request,response){ // 如果地址显示是 \ 则表示根目录 console.log('客户的请求来自'+request.url); // 5 给客户返回数据 response.setHeader('Content-Type','text/html;charset=UTF-8'); // 防止中文乱码 response.write('Hello'); response.write('I have a dream'); response.end(); }); // 4 启动服务器 server.listen(8080,function(){ console.log('服务器已经启动,可以访问8080'); });
-
判断用户登录的是首页还是登录页,响应出不同的数据
// 1 引入http模块 var http = require('http'); // 2使用createServer创建一个服务器 var server = http.createServer(); // 3 监听用户的请求,凡是xxx事件,都可以使用on绑定 server.on('request',function(request,response){ // 根据获取的url判断用户当前访问的页面 var url = request.url; var str = ''; if(url=='/'){ str = '你访问的是首页'; }else if(url=='/login'){ str = '访问的是登录页'; }else{ str = '来自星球的页面'; } // 5 给客户返回数据 response.setHeader('Content-Type','text/html;charset=UTF-8'); //防止中文乱码 response.write(str); response.end(); }); //4 启动服务器 server.listen(8080,function(){ console.log('服务器已经启动,可以访问8080'); });
-
使用 http.createServer() 方法创建服务器
var http = require('http'); http.createServer(function (request, response) { // 发送 HTTP 头部 // HTTP 状态值: 200 : OK // 内容类型: text/plain response.writeHead(200, {'Content-Type': 'text/html;charset=UTF-8'}); // 发送响应数据 "Hello World" response.end('Hello World\n'); }).listen(8889);
-
request中的更多属性
console.log(request.headers); //获取请求头信息(对象) console.log(request.rawHeaders); //获取请求头信息(数组) console.log(request.httpVersion); //获取HTTP版本 console.log(request.method); //获取请求方法 console.log(request.url); //获取请求路径(注:不含网址)
-
response中的更多属性
//方法1:分开写 response.statusCode = 404; response.statusMessage = 'Not Found2'; response.setHeader('Content-Type', 'text/html; charset=utf-8') response.write('打印response数据'); response.end(); //方法2: response.writeHeader(404,'Not Found',{'Content-Type':'text/html;charset=utf8'});
10. 路由搭建
- 路由的使用:url.parse(urlStr, [parseQueryString], [slashesDenoteHost])
- url.pathname 获取及设置URL的路径(path)部分;
- parse() 将一个URL字符串转换成对象并返回,用于地址解析;
var src = "http://127.0.0.1:8888/two?a=3&b=4";
var url = require('url');
console.log(url.parse(src));
// 包含如下:
Url {
protocol: 'http:',
slashes: true,
auth: null, //URL的身份认证信息
host: '127.0.0.1:8888',
port: '8888',
hostname: '127.0.0.1',
hash: null,
search: '?a=3&b=4', //URL的查询字符串部分,包括前导的问号
query: 'a=3&b=4', //要么是查询字符串中的参数部分,要么是含有查询字符串参数和值的解析后的对象
pathname: '/two', //URL的路径部分(包括最初的斜线,如果存在的话)
path: '/two?a=3&b=4',
href: 'http://127.0.0.1:8888/two?a=3&b=4'
}
案例:
- 用户点击one时,跳转到one页面,点击two跳转到two页面
- 将服务器已提供的方法的,分别保存起来
- 开启服务器,进行监听.获取路径中用户访问的地址.
- 将访问路径和已有方法进行比对,如果有则返回响应内容
第一步:编写method.js提供one方法和two方法
//method.js 文件
//分别形成完整的页面结构
function one(){
var body = '<html>' +
'<head>' +
'<meta http-equiv-"Content-Type" content="text/html;charset=UTF-8"/>' +
'</head>' +
'<body>' +
'<a href="/two">我是one页面,点击跳到TWO</a>' +
'</body>'+
'</html>';
return body;
}
function two(){
var body = '<html>' +
'<head>' +
'<meta http-equiv-"Content-Type" content="text/html;charset=UTF-8"/>' +
'</head>' +
'<body>' +
'<a href="/one">我是TWO页面,点击跳到ONE</a>' +
'</body>'+
'</html>';
return body;
}
//导出方法
exports.one = one;
exports.two = two;
第二步:创建server.js 根据不同的路由,显示不同页面
//server.js文件
var http = require('http');
var url = require('url');
//引用第一步写的js文件
var method = require('./method');
function startServer(){
//使用createServer创建一个服务器
var server = http.createServer();
var body ='';
//监听
server.on('request',function(request,response){
var pathName = url.parse(request.url).pathname;
//console.log(pathName);
if(pathName=='/one' || pathName=='/'){
body = method.one();
}
if(pathName=='/two'){
body = method.two();
}
// response.writeHead(200,{"Content-Type":"text/html"});
response.setHeader('Content-Type','text/html;charset=UTF-8');
//打印body
response.write(body);
response.end();
});
//开启服务器,设置端口号
server.listen(8888);
}
startServer();
- 参数的获取 GET&POST
//get方式
let {pathname,query} = url.parse(req.url);
//输出: query.username
//post方式
// 1 引入http模块
var http = require('http');
var url = require('url');
var querystring = require('querystring');
//2 创建服务器
var server = http.createServer();
//3 监听所有的请求
server.on('request',function(request,reponse){
//console.log('请求收到了');
// get参数的接受
// var {pathname,query} = url.parse(request.url);
// console.log(pathname,query)
// post参数的接收
let arr = [];
// 开始接收参数
request.on('data',buffer=>{
arr.push(buffer);
});
// end 表示参数接收完成
request.on('end',()=>{
let buf = Buffer.concat(arr);
// parse这个方法是将一个字符串反序列化为一个对象。
let post = querystring.parse(buf.toString());
console.log(post);
});
})
// 4 开启服务器,制定端口
server.listen(8888,function(){
console.log('服务器8888 开启了')
});
post传递的数据一般比较大,分多次传递,监听data事件,每当一段数据到达时就触发一次,将数组添加到arr数组里。end事件是当所有数据接收完成时触发的。
结尾:
nodeJS很重要,后续会继续总结分享,未完待续~
仅根据个人学习后的理解整理如上知识点,如有错误,请不吝赐教~