node.js基础

初学node.js,听说比php有潜力,而且社区很活跃,因此学一学,看看如何来进行与后端的交互。

1.栗子
const http = require('http');
const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World\n');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

来看看官网的代码,创建了一个简易服务器。

req代表请求的一些信息,比如是get还是post,请求的URL等等。

res代表向请求发出响应,是失败还是成功。

监听端口,执行回调函数。

2.模块

就像java一样,为了避免变量名的复用,nodejs用模块来区分,模块通过require来引入,通过在各自模块中export来暴露方法。

student.js

function add(student){
	console.log('Add Student:'+student)
}
exports.add=add

teacher.js

function add(teacher){
 console.log('Add Teacher:'+teacher)
}
exports.add=add


iclass.js

var student=require('./student')
var teacher=require('./teacher')
function add(teacherName,students){
	teacher.add(teacherName)

	students.forEach(function(item,index) {
		// body...
		student.add(item)
	})
}
exports.addone=add

index.js

var iclass=require('./iclass')

// exports.add=function(classes) {
// 	// body...
// 	classes.forEach(function(item,index){
// 		var _class=item
// 		var teacherName=item.teacherName
// 		var students=item.students

// 		iclass.add(teacherName,students)

// 	})
// }
 iclass.addone('Scott',['白','美']

注意点:exports.本模块外部你想要调用此方法用的名字=本模块中的方法名;同时exports也可以匿名使用,就像上面注释所示。

3.url方法


测试parse解析url地址方法:

protocol是检测协议,slashes检测协议后有无双划线,host为ip地址或者是域名,port端口默认80,hostname主机名,hash对应页面锚点。


此外parse方法还可以接受其他参数(默认false),这里query从字符串变为了对象:


还可以在未知协议的情况下获取正确的path,需要加第三个参数,默认false下面是对比:


生成完整字符串的format方法:


需要传入一个已经被parse解析的对象。
最后是resolve方法,类似于python url包里的urladd方法,合并两个字符串生成正确完整地址:


4.querystring
上面提到了加一个参数true使得parse方法可以从querystring解析出query对象。
同时我们需要从query对象转换为所需要的querystring

首先是stringify方法,传入对象:

添加的第一个参数替换默认的‘&’,第二个参数替换默认的‘=’

其次是反序列化方法,将querystring转换为对象,与url里的不同在于,它传入的参数只是路径后面的内容:

同样当间隔不是默认的‘&’时,要传入该分隔符。

最后是转译方法,escape:
对英文不起作用,对符号与中文等有效。

5.改变上下文环境

看例子就知道了,将上下文从peopleA变为B:

var peopleA={
	name:'John',
	speak:function(iam){
		console.log(iam+this.name)
	}
}

peopleA.speak('i am ')
peopleB={
	name:'whiersty'
}
peopleA.speak.call(peopleB,'you are ')

但是这种改变不太友好,意味着我们用一次就得另外写一句。

可以这样:

function peopleA(name){
	this.name=name
	this.speak=function(){
		console.log(this.name)
	}
}
function peopleB(name){
	peopleA.call(this,name)
}
var pb=new peopleB('whiersty')
pb.speak()

B继承A,并传入一个参数。

6.事件模块

事件的触发:

var EventEmitter=require('events').EventEmitter
var life=new EventEmitter()

life.on('trigger',function(data){
	console.log(data+'trigger被触发')
})

life.emit('trigger','oh ')

========================

http请求:

var http=require('http')
var querystring=require('querystring')

var postData=querystring.stringify({
	'content':'讲的很好,但是有些细节还有点懵',
	'mid':8837
})

var options={
	hostname:'www.imooc.com',
	port:80,
	path:'/course/docomment',
	method:'POST',
	headers:{
		'Accept':'application/json, text/javascript, */*; q=0.01',
		'Accept-Encoding':'gzip, deflate',
		'Accept-Language':'zh-CN,zh;q=0.8',
		'Connection':'keep-alive',
		'Content-Length':postData.length,
		'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
		'Cookie':'imooc_uuid=f42fc314-16a9-48b6-95fa-611514f99e5f; imooc_isnew_ct=1472568015; loginstate=1; apsid=gzMmNlYTRlMmVhNGVhMDY2YWNlODc1MzhiZWQxNzcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMzkwOTA5MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxMTk2NDc1OTQ2QHFxLmNvbQAAAAAAAAAAAAAAAAAAADE0OTBjMWE3ZTdjZWQwMTk5NTBlZWMxY2RmYmFkYWEwZftkWGX7ZFg%3DYT; last_login_username=1196475946%40qq.com; PHPSESSID=9ot9fm0pmpf9mecpp7fa7ro4s1; IMCDNS=0; Hm_lvt_f0cfcccd7b1393990c78efdeebff3968=1483840894,1483929445,1484118913,1484185743; Hm_lpvt_f0cfcccd7b1393990c78efdeebff3968=1484223408; imooc_isnew=2; cvde=5876e090aa47c-109',
		'DNT':1,
		'Host':'www.imooc.com',
		'Origin':'http://www.imooc.com',
		'Referer':'http://www.imooc.com/video/8837',
		'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0',
		'X-Requested-With':'XMLHttpRequest'
	}
}

 var req=http.request(options,function(res){    //拿到返回值
	
     res.on('end',function(){
		console.log('finish')
	})

	res.on('data',function(chunk){
		console.log(Buffer.isBuffer(chunk))
		console.log(typeof chunk)
	})

	console.log('status'+res.statusCode)
	console.log('headers'+JSON.stringify(res.headers))  //打印headers
	
	res.on('error',function(e){
		console.log('error:'+e.message)
	})
})
    req.write(postData)  //将数据写入请求体,不写入不发出
	req.end()





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值