我使用节点js
编写了一个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 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");
}
任何人都可以帮助我,我做错了什么......
由于 维奈
答案 0 :(得分:3)
您的代码几乎正确,但您的代码示例
console.log(data[0].id)
数据对象有否属性 id ,所以如果你只有
console.log(data[0])
你有像
这样的回复{ a: '1' }
因此,您可以通过
访问 a 属性console.log(data[0].a);
更新已更新完整示例
还有一件事是您正在使用 eval ,并且节点附带 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>
这是您想要的完整工作示例。
关于您遇到的相同原始政策问题,主要是因为您无法通过ajax在两个不同的域之间发布数据,除非您使用iframe的一些技巧,但这是另一个故事。
此外,我认为任何人都可以在进入框架之前理解技术的支柱,这对你来说是公平的。
祝你好运答案 1 :(得分:2)
您必须以不同的方式阅读数据。发布的数据以块(“数据”事件)的形式到达节点服务器,必须收集这些数据,直到“结束”事件触发。在此活动中,您可以访问有效负载。
var body = '';
request.addListener('data', function (chunk) {
body += chunk;
});
request.addListener('end', function() {
console.log(body);
res.write('post data: ' + body);
});
另外,您的客户端代码似乎存在一些问题(特别是关于状态代码检查),但我无法真正帮助您,因为我总是使用jQuery等框架来处理管理异步请求。
如果您想构建可靠的node.js服务器供Web使用,我强烈推荐使用高性能HTTP-Framework Express。在节点中开发基于Web的服务器应用程序时,它会消除很多痛苦,并且会得到积极维护。