node.js基础

来源:互联网 发布:女性情趣用品 知乎 编辑:程序博客网 时间:2024/05/22 13:08

初学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=namethis.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').EventEmittervar 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))  //打印headersres.on('error',function(e){console.log('error:'+e.message)})})    req.write(postData)  //将数据写入请求体,不写入不发出req.end()





0 0