最近在用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一下。方便查询