昨天主要了解一下什么是node,以及如何建立一个简单的node的http服务。就前端而言,http请求是最常见的,其中最常见的又属通脱ajax进行异步请求或者是fetch请求,重点看一下ajax吧,先从简单的来。ajax中最常见的请求方式莫过于GET和POST,具体有什么区别这里不详细描述了,ajax要进行请求需要先有一个请求路径,所以先进行服务端的配置。
先引入http的依赖,这里的util下的add方法是我自定义的进行两个数字相加的计算,昨天也先说过需要设置响应头,然后进行加法计算完了调用writeMode方法将计算结果返回到前端,这段demo看似没有什么问题,从浏览器也可以直接获取到值,但是当我们使用ajax进行请求时呢?
明显出现了跨域问题,我这里用的是get请求,那就说明服务端的接口默认是不支持跨域的,那根据提示信息,我们需要再响应头中设置允许跨域访问,
接下来再访问,果然没有问题了,再换成post请求方式,也没有问题。当然这里的头文件设置是根据需求来定,不是说只能定义一种,所以这里用的是writeHead方法,我们可以定义多类型的响应头:
刚刚说到了post请求,通常,我们在进行敏感数据的交互常用的方法,既然说是数据交互,那就涉及到传参了,服务端是如何通过请求对象获取到参数的呢?
我们先在ajax中进行参数的设置:
接下来在服务端,我先把demo全部附上慢慢解释:
通过req.method判断前端的请求方式为post,node中文API中说是监听data后再回调中对接收到的数据进行获取,监听end可以在数据接收完成后对数据进行操作,这里我也简单做了一个测试就是利用刚刚附上的demo进行测试:
可以明显看出,data事件中回调函数的参数是一个个的字符串,这里我引入了node的querystring模块,将字符串转换成了对象,那我在想既然data事件的回调有形参,那end是不是也有,与是试着在控制台打印,但是结果是undefined,证明end是没有形参的,所以我觉得可以将获取到的请求参数的操作尽量放到data中进行。这里简单学了一下req对象获取请求参数的知识,那么对于res.write()返回到前端呢?昨天说这个方法不能传递对象,这个说法是有问题的,不是不能传递对象,而是需要将对象转换成json字符串,否则ajax可能出现能获取到参数,但是进入不了success回调直接进入error的回调,并且返回参数也会报格式错误。虽然node中也有字符串和对象互相转换的方法,但是那是针对url的,因为node使用的是js的语法,所以也可以用JOSN.parse()进行转换,测试过后确实是没问题的。