Node.js简单入门

一.了解nodeJs

1.什么是NodeJS

简单的说 Node.js 就是运行在服务端的 JavaScript
Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台。
Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎(Google的Chrome浏览器使用的JavaScript执行环境),V8引擎执行Javascript的速度非常快,性能非常好。

2.为什么选择NodeJS

如果你是一个前端程序员,你不懂得像PHP、Python或Ruby等动态编程语言,然后你想创建自己的服务,那么Node.js是一个非常好的选择。Node.js 是运行在服务端的 JavaScript,如果你熟悉Javascript,那么你将会很容易的学会Node.js。
当然,如果你是后端程序员,想部署一些高性能的服务,那么学习Node.js也是一个非常好的选择。

3.nodeJS的特点

a. 它是一个Javascript运行环境
b. 依赖于Chrome V8引擎进行代码解释
c. 事件驱动
d. 非阻塞I/O
e. 轻量、可伸缩,适于实时数据交互应用
f. 单进程,单线程

4.nodeJS的技术

A、nodejs.org看看nodejs的版本升级,新特性的加入,重要bug的修复等
B、www.npmjs.com模块社区,看他人源代码,省力
C、github.com大量的项目和源码
D、stackoverflow.com技术解答社区以及查询相关资源,环境配置,异常均可找到答案

5.注意

nodejs的文档一定要和使用的版本保持相同,不同版本的接口或者其他方面甚至不同

6.Node.js 创建第一个应用

a.创建beginning/server.js
//1.引入 required 模块
var http = require('http');
//2.创建服务器
http.createServer(function (request, response) {
    // 发送 HTTP 头部 
    // HTTP 状态值: 200 : OK
    // 内容类型: text/plain
    response.writeHead(200, {'Content-Type': 'text/plain'});

    // 发送响应数据 "Hello World"
    response.end('Hello World\n');
}).listen(8888);//监听请求

// 终端打印如下信息
console.log('Server running at http://127.0.0.1:8888/');

b.在cmd运行命令中找到项目:执行node server.js

c.打开浏览器:http://127.0.0.1:8888/


7.node.js和浏览器执行环境

相同点:都能执行一般的Js代码
不同点:全局变量不同,例如window,document等只能在浏览器中取到,而process则只能在node环境中取到。
宿主:浏览器、node;

全局变量:浏览器-window、document;node - process;

二.简单的nodejs模块

1.模块的流程

创建模块( teacher.js)——》导出模块(exports.add=function(){.......})——》加载模块(var teacher=require('./teacher.js'))——》使用模块(teacher.add('Scott'))

2.简单的例子

一个班级里有老师和学生。创建school的文件

a.student.js

function  add(student) {
	console.log('添加学生:'+ student);
}
exports.add = add;

b.teacher.js

function  add(teacher) {
	console.log('添加老师:'+ teacher);
}
exports.add = add;

c.class.js

//使用模块前要使用 require 导入模块student
var student = require('./student')
var teacher = require('./teacher')
function add(teacherName,students) {
	teacher.add(teacherName)
	students.forEach(function(item,index){
		student.add(item)
	})
}
exports.add = add;

d.index.js 入口文件

//启动文件  入口文件
var Classs = require('./class')
Classs.add('刘老师',['小高','小林','小廖'])

3.注意:

a.模块化:
     给每个对象新建一个单独的js,在里面对该对象属性方法进行定义,通过exports将该对象内部的方法属性暴露出来,使得其他对象能够访问,但是在访问之前必须在自身js中通过require引入该模块。
b.使用模块前要使用 require 导入模块
c.module.exports和export区别:
module.exports = add;特别的对象类型;(推荐使用,支持现有)

exports.add = add;传统的模块实例;(exports是辅助方法) 推荐使用

三.nodejs API

1.url

(1).URL基础知识点
.protocol:表示url采用的什么协议
.slashes:表示是否有斜线
.host:表示主机/IP地址 /域名
.post:端口(默认80端口不显示)
.hostname:主机名称
.hash:#后面的内容
.search:是查询字符串的参数

.pathname:获取及设置URL的路径(path)部分

(2).常用方法

a.url.parse 解析地址   在项目中特别好用


注意:url.parse(‘url‘,true):第二个参数为true, query被转换为了一个对象


b.url.format():将url对象格式化为url 字符串 

url.format(url{protocol:'http'.........}) 输入上面那段url  就会得到一个url地址:http://www.baidu.com:8080/course/list?id=1002&name=xiaogao#floor_a1

c.url.resolve():用于解析,接受两个参数,拼接


2.querystring - 查询字符串

(1).querystring.stringfy(对象,连接符,键值对符号符号)->对象转换为对象字符串

该方法通过遍历给定的 obj 对象的自身属性,生成 URL 查询字符串

querystring.stringify({ foo: 'bar', baz: ['qux', 'quux'], corge: '' });
// 返回 'foo=bar&baz=qux&baz=quux&corge='

querystring.stringify({ foo: 'bar', baz: 'qux' }, ';', ':');
// 返回 'foo:bar;baz:qux'

(2).querystring.parse(对象字符串,需要转换的属性连接符,键值对符号)->对象字符串转换为对象

一个 URL 查询字符串 str 解析成一个键值对的集合

querystring.parse('foo=bar&abc=xyz&abc=123')
输出
{
  foo: 'bar',
  abc: ['xyz', '123']
}
(3).querystring.escape()  对给定的 str 进行 URL 编码
该方法是提供给 querystring.stringify() 使用的,通常不直接使用。
(4).querystring.unescape('反转义字符串')->反转义字符串  

对给定的 str 进行解码。该方法是提供给 querystring.parse() 使用的,通常不直接使用

3.http

http :就是一个协议

http客户端发送请求,创建端口——》http服务器在端口监听客服端请求——》http服务器向客服端返回状态和内容

a.http进阶概念

1. 什么是回调?
回调是异步编程最基本的方法,对nodejs来说要按顺序执行异步逻辑的时候,一般采取后续传递的方式
将后续逻辑封装成在回调函数中做起始函数的参数,逐层嵌套
2. 什么是同步/异步?
同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。  
异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。  
3. 什么是I/O?
磁盘的写入(in)
磁盘的读取(out)
4. 什么的单线程/多线程?
一次只能执行一个程序叫做单线程
一次能执行多个程序叫多线程
5. 什么是阻塞/非阻塞?
阻塞:前一个程序未执行完就得一直等待
非阻塞:前一个程序未执行完时可以挂起,继续执行其他程序,等到使用时再执行
6. 什么是事件?
一个触发动作(例如点击按钮)
7. 什么是事件驱动?
一个触发动作引起的操作(例如点击按钮后弹出一个对话框)
8. 什么是基于事件驱动的回调?
为了某个事件注册了回调函数,但是这个回调函数不是马上执行,只有当事件发生的时候,才会调用回调函数,这种函数执行的方式叫做事件驱动~这种注册回调就是基于事件驱动的回调,如果这些回调和异步I/O(数据写入、读取)操作有关,可以看作是基于回调的异步I/O,只不过这种回调在nodejs中是有事件来驱动的
9. 什么是事件循环?
//事件循环Eventloop,倘若有大量的异步操作,一些I/O的耗时操作,甚至是一些定时器控制的延时操作,它们完成的时候都要调用相应的回调函数,从而来完成一些密集的任务,而又不会阻塞整个程序执行的流程,此时需要一种机制来管理,这种机制叫做事件循环.
总而言之就是:管理大量异步操作的机制叫做事件循环

b.作用域和上下文

①作用域:与调用函数,访问变量的能力有关 
作用域分为:局部和全局(在局部作用域里可以访问到全局作用域的变量,但在局部作用域外面就访问不到局部作用里面所设定的变量)
②上下文:与this关键字有关 是调用当前可执行代码的引用
    this总是指向调用这个的方法的对象

js里的this通常是当前函数的拥有者,这个拥有者叫做执行上下文

//*this 在对象中,指向对象;在函数中,指向window/gloab ,在构造函数中,指向new后的对象。
var pet ={
	words:'...',
	speak:function () {
		console.log(this) //输出是 pet
	}
}
pet.speak();


function we(words){
	this.words=words;
	console.log(this)
}
we('...');//打印在浏览器的情况下是 window  在node环境下 global


function pets(words){
	this.words=words;
	this.speaks =function(){
		console.log(this)
	}
}
var cat =new pets('Miao');
cat.speaks();//this指向构造函数pets


//*call /apply都可以改变this的指向

var dog_pets ={
	words:'...',
	dog_speaks:function (say) {
		console.log(say+' ' +this.words)
	}
}
var dog = {
	words:'Wang'
}

dog_pets.dog_speaks.call(dog,'speak');//speak Wang

三.例子

1.创建一个httpsever服务器

let http = require('http');
//4.加载url模块 :解析请求的头,地址
let url = require('url');
//5.
let util = require('util');
//2.创建Server
let server = http.createServer((req,res) =>{
	//2.1.状态码:HTTP 状态值: 200 : OK  
	res.statusCode = 200;
	//2.2设置服务器响应 响应的头 内容类型: text/plain  
	res.setHeader["content-type","text/plain;charset=utf-8"];
	//4.1拿到浏览器访问url  url.parse(req.url)  
	//5.1调试模式util.inspect() 是一个object对象
	//2.3响应结束 输出
	res.end(util.inspect(url.parse(req.url)));
})
//3.监听端口
server.listen(3000,'127.0.0.1', () =>{
	console.log("服务器已经运行,请打开浏览器,输入:http://127.0.0.1:3000/ 来")
})

2.创建一个web服务器,可以访问到HTML内容

sever.js

//1.加载http模块 加载url模块 :解析请求的头,地址
let http = require('http');
let url = require('url');
let util = require('util');

/*
如何访问呢,就是通过fs读我们的文件
*/
//6 加载fs模块
let fs = require('fs');

//2.创建Server
let server = http.createServer((req,res) =>{ 
	res.statusCode = 200;
	res.setHeader["content-type","text/plain;charset=utf-8"];
	//6.1 
	var pathName = url.parse(req.url).pathname;
	//6.2 读取文件  注意:res.end();要放在读取文件中
	fs.readFile(pathName.substring(1), (err, data) => {
	 	if(err){
	 		res.writeHead(404,{
	 			'content-type':'text/html'
	 		});
	 	}else{
	 		res.writeHead(200,{
	 			'content-type':'text/html'
	 		});
	 		//6.3 获取内容写出来
	 		res.write(data.toString());
	 	}
	 	res.end();
	});
	
})
//3.监听端口
server.listen(3000,'127.0.0.1', () =>{
	console.log("服务器已经运行,请打开浏览器,输入:http://127.0.0.1:3000/ 来")
})

index.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
		<title>Examples</title>
		<meta name="description" content="">
		<meta name="keywords" content="">
		<link href="" rel="stylesheet">
	</head>
<body>
    hello,请访问
    创建一个web容器,可以访问到HTML内容
</body>
</html>

3.通过http请求获取第三方服务

client.js

/*通过http请求获取第三方服务
//浏览器是客户端  node服务端(nodejs提供一种服务,是可以被人调用的,就是服务端)
比如有时候要去获取其他服务器上的数据,通过http模拟请求,获取第三方插件,此时nodejs就变成客服端
nodejs里面有客户端和服务端,nodejs提供一种被人调用的请求,这就变成服务端,如果是要调用第三方服务,此时nodejs的方式就变成客户端
*/

let http = require('http');
//3调试
let util = require('util');
//2.加载任意接口  第三方接口数据
http.get('http://www.imooc.com/u/card',function(res) {
	let data = '';
	//2.1监听: 接受接口数据
	res.on("data",function (chunk){
		data += chunk;
	})
	//2.2监听:什么时候接受完数据
	res.on("end",function(){
		let result = JSON.parse(data);
		console.log("数据:"+util.inspect(result));
	})

})


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值