Javascript 使用ajax post请求从节点服务器接收响应时出现问题
我已经使用NodeJS编写了一个http服务器Javascript 使用ajax post请求从节点服务器接收响应时出现问题,javascript,ajax,node.js,Javascript,Ajax,Node.js,我已经使用NodeJS编写了一个http服务器 var sys = require("sys"), http = require("http"), url = require("url"), path = require("path"), fs = require("fs"); http.createServer(function(request, res) { var parsed_url = url.parse(request.url);
var sys = require("sys"),
http = require("http"),
url = require("url"),
path = require("path"),
fs = require("fs");
http.createServer(function(request, res) {
var parsed_url = url.parse(request.url);
var uri = parsed_url.pathname;
if(uri === "/test"){
res.writeHead(200, {'Content-Type': 'text/javascript'});
request.addListener('data', function (chunk) {
var data = eval("(" + chunk + ")");
console.log(data[0].id);
})
request.addListener('end', function() {
console.log('end triggered');
res.write("Post data");
res.end();
});
}
}).listen(8080);
我试图发回ajax请求的响应,但我无法收到任何响应。下面是ajax请求的代码
var myhttp = new XMLHttpRequest();
var url = "http://localhost:8080/test";
var data = [{"a":"1"},{"b":"2"},{"c":"3"}];
var dataJson = JSON.stringify(data);
myhttp.open('POST', url, true);
myhttp.send(dataJson);
myhttp.onreadystatechange = function() {
if ((myhttp.readyState == 4) && (myhttp.status == 200)){
alert(myhttp.responseText);
}
else if ((myhttp.readyState == 4) && (myhttp.status != 200))
{
console.log("Error in Connection");
}
谁能帮我一下我做错了什么
谢谢
Vinay您必须以不同的方式读取数据。已发布的数据以块的形式到达节点服务器(“数据”事件),必须收集这些数据,直到触发“结束”事件。在此事件中,您可以访问有效负载
var body = '';
request.addListener('data', function (chunk) {
body += chunk;
});
request.addListener('end', function() {
console.log(body);
res.write('post data: ' + body);
});
此外,您的客户端代码似乎存在一些问题(特别是关于状态代码检查),但我无法真正帮助您解决这些问题,因为我总是使用类似于管理异步请求的框架
如果您想构建可靠的node.js服务器供web使用,我强烈推荐使用高性能HTTP框架。在node中开发基于web的服务器应用程序时,它消除了许多痛苦,并得到了积极维护。您必须以不同的方式读取数据。已发布的数据以块的形式到达节点服务器(“数据”事件),必须收集这些数据,直到触发“结束”事件。在此事件中,您可以访问有效负载
var body = '';
request.addListener('data', function (chunk) {
body += chunk;
});
request.addListener('end', function() {
console.log(body);
res.write('post data: ' + body);
});
此外,您的客户端代码似乎存在一些问题(特别是关于状态代码检查),但我无法真正帮助您解决这些问题,因为我总是使用类似于管理异步请求的框架
如果您想构建可靠的node.js服务器供web使用,我强烈推荐使用高性能HTTP框架。在node中开发基于web的服务器应用程序时,它消除了许多痛苦,并得到了积极的维护。您的代码几乎正确,但在代码示例中,您有
console.log(data[0].id)
数据对象具有no属性id,因此如果只有
console.log(data[0])
你的回答是这样的
{ a: '1' }
因此,您可以通过执行以下操作访问属性a
console.log(data[0].a);
更新了完整的示例
还有一件事是,您正在使用eval,node附带了JSON.parse包,下面的代码片段就是我如何使它工作的
文件:app.js
var sys = require("sys"),
http = require("http"),
url = require("url"),
path = require("path"),
fs = require("fs");
http.createServer(function(request, res) {
var parsed_url = url.parse(request.url);
var uri = parsed_url.pathname;
if(uri === "/test"){
res.writeHead(200, {'Content-Type': 'text/javascript'});
request.addListener('data', function (chunk) {
// removed this - eval("(" + chunk + ")");
var data = JSON.parse(chunk);
console.log(data[0].a);
})
request.addListener('end', function() {
console.log('end triggered');
res.write("Post data");
res.end();
});
} else if(uri === "/") {
fs.readFile("./index.html",function(err, data){
if(err) throw err;
res.writeHead(200, {'Content-Type': 'text/html'});
res.end(data);
});
}
}).listen(8080);
在同一目录上创建一个文件index.html,其中包含以下内容:
<html>
<head>
<script type="text/javascript" charset="utf-8">
var myhttp = new XMLHttpRequest();
var url = "http://localhost:8080/test";
var data = [{"a":"1"},{"b":"2"},{"c":"3"}];
var dataJson = JSON.stringify(data);
myhttp.open('POST', url, true);
myhttp.send(dataJson);
myhttp.onreadystatechange = function() {
if ((myhttp.readyState == 4) && (myhttp.status == 200)){
alert(myhttp.responseText);
}
else if ((myhttp.readyState == 4) && (myhttp.status != 200))
{
console.log("Error in Connection");
}
}
</script>
</head>
<body>
</body>
</html>
var myhttp=newXMLHttpRequest();
变量url=”http://localhost:8080/test";
变量数据=[{a:“1”},{b:“2”},{c:“3”}];
var dataJson=JSON.stringify(数据);
myhttp.open('POST',url,true);
myhttp.send(dataJson);
myhttp.onreadystatechange=函数(){
如果((myhttp.readyState==4)和&(myhttp.status==200)){
警报(myhttp.responseText);
}
else if((myhttp.readyState==4)和&(myhttp.status!=200))
{
控制台日志(“连接错误”);
}
}
这是你想要的一个完整的工作示例
关于同源策略问题,您遇到的问题主要是因为您不能通过ajax在两个不同的域之间发布数据,除非您对iFrame使用一些技巧,但这是另一回事
此外,我认为,在进入框架之前,了解技术的主干对任何人都是有益的,这样对您来说都是公平的
祝您好运您的代码几乎正确,但在您的代码示例中
console.log(data[0].id)
数据对象具有no属性id,因此如果只有
console.log(data[0])
你的回答是这样的
{ a: '1' }
因此,您可以通过执行以下操作访问属性a
console.log(data[0].a);
更新了完整的示例
还有一件事是,您正在使用eval,node附带了JSON.parse包,下面的代码片段就是我如何使它工作的
文件:app.js
var sys = require("sys"),
http = require("http"),
url = require("url"),
path = require("path"),
fs = require("fs");
http.createServer(function(request, res) {
var parsed_url = url.parse(request.url);
var uri = parsed_url.pathname;
if(uri === "/test"){
res.writeHead(200, {'Content-Type': 'text/javascript'});
request.addListener('data', function (chunk) {
// removed this - eval("(" + chunk + ")");
var data = JSON.parse(chunk);
console.log(data[0].a);
})
request.addListener('end', function() {
console.log('end triggered');
res.write("Post data");
res.end();
});
} else if(uri === "/") {
fs.readFile("./index.html",function(err, data){
if(err) throw err;
res.writeHead(200, {'Content-Type': 'text/html'});
res.end(data);
});
}
}).listen(8080);
在同一目录上创建一个文件index.html,其中包含以下内容:
<html>
<head>
<script type="text/javascript" charset="utf-8">
var myhttp = new XMLHttpRequest();
var url = "http://localhost:8080/test";
var data = [{"a":"1"},{"b":"2"},{"c":"3"}];
var dataJson = JSON.stringify(data);
myhttp.open('POST', url, true);
myhttp.send(dataJson);
myhttp.onreadystatechange = function() {
if ((myhttp.readyState == 4) && (myhttp.status == 200)){
alert(myhttp.responseText);
}
else if ((myhttp.readyState == 4) && (myhttp.status != 200))
{
console.log("Error in Connection");
}
}
</script>
</head>
<body>
</body>
</html>
var myhttp=newXMLHttpRequest();
变量url=”http://localhost:8080/test";
变量数据=[{a:“1”},{b:“2”},{c:“3”}];
var dataJson=JSON.stringify(数据);
myhttp.open('POST',url,true);
myhttp.send(dataJson);
myhttp.onreadystatechange=函数(){
如果((myhttp.readyState==4)和&(myhttp.status==200)){
警报(myhttp.responseText);
}
else if((myhttp.readyState==4)和&(myhttp.status!=200))
{
控制台日志(“连接错误”);
}
}
这是你想要的一个完整的工作示例
关于同源策略问题,您遇到的问题主要是因为您不能通过ajax在两个不同的域之间发布数据,除非您对iFrame使用一些技巧,但这是另一回事
此外,我认为,在进入框架之前,了解技术的主干对任何人都是有益的,这样对您来说都是公平的
祝你好运同样在chrome中,我得到了错误:Access-Control-Allow-Origin不允许使用Origin null。同样在chrome中,我得到了错误:Access-Control-Allow-Origin不允许使用Origin null。嘿,当我用res.writeHead(200,{'Content-Type':'text/javascript','Access-Control-Allow-Origin':'*'});但在chrome上,我发现访问控制允许标头不允许使用errorRequest标头字段内容类型。您知道如何在chrome中解决此问题。示例是否在同一主机和端口上运行?如果不是,则在发出ajax请求时必须使用jsonp。谢谢Joao,实际上问题是需要o为基于webkit的浏览器设置访问控制允许标头-“内容类型”在响应标头中解决了此问题。由于webkit将ajax请求分为两部分。因此,通过查看webkit cors解决了此问题:-)嘿,这很有效