初学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()