使用 Javascript XMLHttpRequest 从 Mongolab 获取文档
Getting documents from Mongolab with Javascript XMLHttpRequest
我试图在不知道该文档 ID 的情况下获取特定文档。由于我使用的是 Mongolab,因此无法查询 ID,因为我让 Mongolab 生成了这些 ID。
我已经设法提醒整个集合,但只要我尝试添加查询属性,它就会在提醒中弹出 "undefined"!
有效并提醒整个集合的代码:
var xhrGet = new XMLHttpRequest();
xhrGet.open("GET", 'https://api.mongolab.com/api/1/databases/MYBASE/collections/MYCOLLECTION&apiKey=MYAPIKEY');
xhrGet.onreadystatechange = function(){
existingUrl = xhrGet.responseText;
alert(existingUrl);
}
xhrGet.send();
提供 Mongolab JSON 格式的片段:
{
"_id": {
"$oid": "MongoLab ID"
},
"visited": {
"url": "SomeURL",
"weight": 1
}
}
我的问题是我只想访问此 JSON 文件的 "url" 字段。当我尝试将例如 .visited 或 .visited.url 添加到警报时;它变成 "undefined"。
alert(existingUrl.visited);
和
alert(existingUrl.visited.url);
都未定义!
对此有什么想法和解决方案吗?
解决方案(在@furrypet 的帮助下和一些更详细的阅读):
var xhrGet = new XMLHttpRequest()
xhrGet.open("GET", 'https://api.mongolab.com/api/1/databases/MYBASE/collections/MYCOLLECTION?q={"visited.url": "' + THEURL + '"}&apiKey=MYAPIKEY');
xhrGet.onreadystatechange = function(){
var response = JSON.parse(xhrGet.responseText);
for(var i = 0; i < response.length; i++){
var temp = response[i];
alert(temp.visited.url);
}
}
使用 responseText,您的响应格式是纯文本,这意味着您不能像 JSON 对象那样操作它。
您可以更改使用的方法,例如将其替换为 responseXML 以获得 XML 格式,但我建议您使用 JSON.parse将您的响应字符串变成 JSON.
所以添加如下内容:
response = JSON.parse(existingUrl);
并且您应该能够查询响应对象。有关详细信息,请在此处查看 https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest and here https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/JSON/parse
编辑:
根据 OP 的建议,这里有一个简单的例子:
// The string should be a valid JSON
var jsonString = '{"hello":"world"}';
var jsonObj = JSON.parse(jsonString); // Returns 'Object { hello: "World" }
// Now you can use jsonObj like a regular JSON Object. Therefore :
jsonObj.hello; // will output "World"
// Reciprocally, if you want to turn a JSON into a string, you may use:
JSON.stringify(jsonObj); // returns "{"hello":"world"}"
我试图在不知道该文档 ID 的情况下获取特定文档。由于我使用的是 Mongolab,因此无法查询 ID,因为我让 Mongolab 生成了这些 ID。
我已经设法提醒整个集合,但只要我尝试添加查询属性,它就会在提醒中弹出 "undefined"!
有效并提醒整个集合的代码:
var xhrGet = new XMLHttpRequest();
xhrGet.open("GET", 'https://api.mongolab.com/api/1/databases/MYBASE/collections/MYCOLLECTION&apiKey=MYAPIKEY');
xhrGet.onreadystatechange = function(){
existingUrl = xhrGet.responseText;
alert(existingUrl);
}
xhrGet.send();
提供 Mongolab JSON 格式的片段:
{
"_id": {
"$oid": "MongoLab ID"
},
"visited": {
"url": "SomeURL",
"weight": 1
}
}
我的问题是我只想访问此 JSON 文件的 "url" 字段。当我尝试将例如 .visited 或 .visited.url 添加到警报时;它变成 "undefined"。
alert(existingUrl.visited);
和
alert(existingUrl.visited.url);
都未定义!
对此有什么想法和解决方案吗?
解决方案(在@furrypet 的帮助下和一些更详细的阅读):
var xhrGet = new XMLHttpRequest()
xhrGet.open("GET", 'https://api.mongolab.com/api/1/databases/MYBASE/collections/MYCOLLECTION?q={"visited.url": "' + THEURL + '"}&apiKey=MYAPIKEY');
xhrGet.onreadystatechange = function(){
var response = JSON.parse(xhrGet.responseText);
for(var i = 0; i < response.length; i++){
var temp = response[i];
alert(temp.visited.url);
}
}
使用 responseText,您的响应格式是纯文本,这意味着您不能像 JSON 对象那样操作它。
您可以更改使用的方法,例如将其替换为 responseXML 以获得 XML 格式,但我建议您使用 JSON.parse将您的响应字符串变成 JSON.
所以添加如下内容:
response = JSON.parse(existingUrl);
并且您应该能够查询响应对象。有关详细信息,请在此处查看 https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest and here https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/JSON/parse
编辑:
根据 OP 的建议,这里有一个简单的例子:
// The string should be a valid JSON
var jsonString = '{"hello":"world"}';
var jsonObj = JSON.parse(jsonString); // Returns 'Object { hello: "World" }
// Now you can use jsonObj like a regular JSON Object. Therefore :
jsonObj.hello; // will output "World"
// Reciprocally, if you want to turn a JSON into a string, you may use:
JSON.stringify(jsonObj); // returns "{"hello":"world"}"