AJax技术

使用Ajax时遇到“未收到数据”的处理方式

字号+ 作者:H5之家 来源:H5之家 2016-10-13 12:01 我要评论( )

CNode:Node.js专业中文社区

最近在用node构建一个应用的时候用到了ajax的跨域POST请求, 使用官方标准写法

http.createServer(function (request, response) { response.writeHead(200, { 'Content-Type': 'text/html' }); response.end('hi~');

}

会报错“未收到数据”, 但是如果把Ajax换成正常form提交,则会显示OK。

经过一番折腾终于发现原因: 一定要在服务端header里面加上”Access-Control-Allow-Origin“(允许跨域来源)

response.writeHead(200, { 'Content-Type': 'text/html', 'Access-Control-Allow-Origin' : '*' });

同时在客户端处理异常的时候也要注意 提交的dataType和返回的一定要一致 例如

$.ajax({ url: 'http://etc.xicp.net:8080/', type: 'POST', data:{content:content} , dateType:'string', cache : false, error: function(XMLHttpRequest, textStatus, errorThrown) { if(XMLHttpRequest.readyState==4) { //alert(XMLHttpRequest.status); //alert(XMLHttpRequest.readyState); //alert(textStatus); console.log('ajax error:%s',textStatus); } else alert('error:'+textStatus); }, success: function(str){ alert(str); } });

其实在Ajax提交的时候容易遇到两个问题 1、客户端格式解析错误 其中即使提交、返回都OK。 XMLHttpRequest.status=200(正常响应) XMLHttpRequest.readyState=4(正常接收)

ajax也会提示一个parseerror的错误。就是上面说的dataType的问题

2、POST接收的问题

习惯了.net或者asp的可能有点不习惯这里的事件驱动,最早写法是这样的

var info =''; var content=''; request.addListener('data', function(chunk){ info += chunk; }).addListener('end', function(){ info = querystring.parse(info); content= info.content; }); response.writeHead(200, { 'Content-Type': 'text/html', 'Access-Control-Allow-Origin' : '*' }); response.end(content);

结果发现总是输出不了content,最后发现是事件驱动的问题 data提交是一个异步过程,会不断地触发data事件,所以end事件响应要晚于request事件。 按照官方文档的要求”每个请求都要有一个 response.end 响应标记结束。这个响应必须放在 ends事件的向应里,既下面这个函数里

addListener('end', function(){

实际上这两个问题都并不完全是Node本身问题,不过估计很多入门的同学还是会遇到,在此Mark一下。方便查询

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  •  使用反向代理(NodeJS)调试前端AJAX

    使用反向代理(NodeJS)调试前端AJAX

    2016-04-13 14:20

网友点评