目录
1.node.js基于Chrome V8引擎的JavaScript环境,它里面一共有两个信息点;
第一个信息点:Chrome V8引擎,它是基于Chrome浏览器端新一代的V8引擎,它的渲染速度更快,性能更高;
第二个信息点:JavaScript运行环境,也就是说我们可以编写JavaScript代码在我们的服务器端进行编译和运行.
nodeJS特点:
1、基于Chrome V8引擎,它可以构建高性能可扩展的高性能服务器,在处理高并发方面有一定的优势,node和C语言相比在性能方面几乎不相上下;
2、单线程,JavaScript本身是一门单线程的编程语言,它和Java相比,Java语言本身是多线程的;(何为单线程,就是说在同一时间,它只能做同一件事)
3、使用JavaScript开发后端代码 我们可以使用nodeJS像开发前端一样去开发后端服务,只不过nodeJS提供了一些服务端的模块,它和前端的一些框架其实是不太一样的,我们不能将前端的一些框架库直接运用到后端,但是nodeJS提供了和我们前端一样的语法来去开发;
4、非阻塞的IO,因为我们的nodeJS本身是基于事件去驱动的;
————————————————————————————————————————————————————————
NodeJS本身是基于Common规范的
创建一个Http Server
创建一个Web容器,可以访问到HTML内容
Http模块客户端的演示
下面我们演示一下CommonJS规范,
在目录下建一个server目录;
在里面建一个User.js文件
/**
* commonJS规范使用module.exports向外输出
*/
module.exports = {
userName:"Jack",
sayHello: function () {
return "Hello";
}
}
再建一个Demo.js目录
/**
* commonJS规范使用require加载其他模块
* commonJS规范中一个文件就代表一个模块
* nodeJS本身是可以使用ES6语法的
* 这里我们之所以可以之际使用require是因为node包中自带了require
*/
let user = require('./User');
/** 打印属性 */
console.log(`userName:${user.userName}`);
/** 打印方法 */
console.log(`I'm ${user.userName},I say ${user.sayHello()}`)
进入Server目录, cd server
运行 node Demo.js
User.js还可以通过exports输出
/**
* 还可以通过exports.输出
*/
exports.userName = "Tom";
exports.sayHello = function () {
return "World";
}
————————————————————————————————————————————————————————
在Demo.js中创建Server;
引入http模块创建服务
引入url解析url
引入util将对象转换成字符串输出
- res.statusCode设置返回状态码
-
res.setHeader设置响应头信息
-
res.end返回输出
-
listen 输入监听端口 主机地址 和 回调函数
url.parse() 解析url
util.inspect() 将对象转换成字符串输出
/** ------首先加载http模块-------------------------------------- */
let http = require('http');
let url = require('url'); // url模块是专门用来解析请求头的
let util = require('util'); // j引入util将对象转换程字符串输出
// 创建Server
let server = http.createServer((req,res)=> {
res.statusCode = 200; // 设置成功返回的状态码
res.setHeader("Content-Type","text/plain; charset=utf-8"); // 设置服务器端响应头
// url.parse(req.url) 我们在res.end将url输出
// util.inspect(url.parse(req.url)) // 是一种调试模式,通过inspect可以将对象转换成字符串输出
console.log("url:" + req.url); // 我们发现打印出来的地址并不包括我们的协议和hash的
// 如果我们希望将完整的url解析有两种方法
// 第一种: 我们可以直接将完整的url放入url.parse中,如util.inspect(url.parse("http://localhost:3000/demo.html?a=123#tag"))
// 第二种: 在node的express框架中有个方法叫做originalUrl 如: util.inspect(url.parse(req.originalUrl));
res.end(util.inspect(url.parse(req.url))); // res.end输出 ,当然也可以使用res.write输出
}).listen(3000, '127.0.0.1', () => { // 使用listen设置监听端口 和 主机IP以及回调
console.log("服务器已经运行,请打开浏览器,输入http://127.0.0.1:3000/ 来进行访问.")
});
运行node Demo.js
————————————————————————————————————————————————————————
访问HTML静态页
在Server目录下创建一个index.html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title> Title </title>
</head>
<body>
<h2>hello,测试一下,能否访问到</h2>
</body>
</html>
重新创建一个Server.js
let http = require('http');
let url = require('url');
let util = require('util');
let fs = require('fs'); // 引入fs文件系统模块
let server = http.createServer((req,res)=> {
var pathname = url.parse(req.url).pathname; // 获取文件名称
fs.readFile(pathname.substring(1), function (err,data) {
if(err) {
res.writeHead(404,{
'Content-Type':'text/html'
});
} else {
res.writeHead(200,{
'Content-Type':'text/html'
})
res.write(data.toString());
}
res.end();
});
}).listen(3000, '127.0.0.1', () => {
console.log("服务器已经运行,请打开浏览器,输入http://127.0.0.1:3000/index.html 来进行访问.")
});
运行node server.js
打开 http://127.0.0.1:3000/index.html
————————————————————————————————————————————————————————
使用http模块模拟调用第三方的接口
有些时候我们有些需求,去调用第三方的接口,大家可能会有疑问?nodeJS本身就是提供后端服务的,为什么还有提供第三方服务呢?nodeJS本身是给客户端去提供接口的,但是有些时候比如我们调用微信的SDK获取签名,或者说我们调用百度的云识别,我们需要去通过Http模拟请求来去访问第三方的接口,那么nodeJS你相对应的变成客户端。
有疑问也可以访问node.js文档 http://nodejs.cn/api/http.html
我建一个client.js客户端,client.js虽然被称之为客户端,但是它和前端是两回事,因为nnodeJS本身是一门服务端的语言,之所以nodeJS内部又分服务端和客户端是因为nodeJS本身可以提供一种服务被别人调用,被别人调用我们就可以称之为服务端。
但是我们有的时候也有一种需要,我们的底层服务是在别的服务器上搭建的,我们nodeJS需要去调用其他的服务,因此我们把这种方式就称之为客户端。它只是一种说法,它是相对而言的。
let http = require('http');
let util = require('util');
http.get('http://www.imooc.com/u/loading', function (res){
let data = '';
res.on("data", function (chunk) { // 使用res.on来监听数据的接收 它并不能一次性的接收所有的数据 所以我们要使用++的形式 它需要有一个监听的过程
data += chunk;
});
res.on("end", function () { // 最后还需要监听end 我们要知道什么时候接收完
let result = JSON.parse(data); // 我们接收的data是字符串,我们需要使用JSON.parse把data进行转换成对象来返回给客户端
// util.inspect 转换成字符串输出
console.log("result:" + util.inspect(result));
})
});
运行node client.js