我正在使用虚拟服务器设置ajax客户端(仅供测试)。我已经设法解决了cors问题,但是从ajax客户端看到的响应是不确定的。当我仅使用浏览器输入相同的URL时,它将正确显示该对象。
// server-side
var express = require('express');
var router = express.Router();
var cors = require('cors');
router.use(cors());
var data = [
{"id": 1, "message": 'first object'},
{"id": 2, "message": 'second object'},
{"id": 3, "message": 'third object'}
];
router.get('/', (req, res, next) => {
console.log("building response body");
res.json(data);
});
// client-side
function fetcher() {
console.log("fetch from:" + rootUrl + arrayEndpoint);
fetch(rootUrl + arrayEndpoint, {
mode: "cors",
method: "GET",
headers: {
"Content-Type": "application/json"
}
})
.then((response) => {
console.log(response);
console.log("response: " + response.body);
})
.catch((error) => {
console.log("error: " + error);
});
}
打印到客户端控制台的响应:
Response { type: "cors", url: "https://angry-badger-63.localtunnel.me/getArray/", redirected: false, status: 200, ok: true, statusText: "OK", headers: Headers, bodyUsed: false }
undefined
在浏览器上:
[{"id":1,"message":"first object"},{"id":2,"message":"second object"},{"id":3,"message":"third object"}]
所以我很确定我的服务器端很好(它确实向浏览器发送了我期望的值,以及resp.json(object)到底有多复杂?),但是显然我所使用的ajax客户端没有看到。怎么了?
答案 0 :(得分:0)
考虑到SLak的评论,fetch没有resp.body,我只是假设这样。那里是巨大的盲点。
这揭示了另一个问题-resp.json()(将是处理它的实际方法)返回了一个我没有处理的承诺。实际上,似乎响应的解析(无论是.json()还是.text())通常都会返回一个Promise。我仍然没有真正使数组正确,但是为了使事情成话题,这里有一个更正的代码片段,用于解析通用json对象:
//client.js
function fetcher() {
console.log("fetch from:" + rootUrl + arrayEndpoint);
fetch(rootUrl + arrayEndpoint,{
mode: "cors",
method: "GET",
headers: {"Content-Type": "application/json"}
})
.then(function(response) {
response.json()
.then(function (data) {
console.log(data);
});
})
.catch(error => console.log("error:" + error));
}
//server.js
var express = require('express');
var router = express.Router();
var cors = require('cors');
/* GET users listing. */
router.use(cors());
var data = {"1":{"id":1, "message": 'first object'},
"2":{"id":2, "message": 'second object'},
"3":{"id":3, "message": 'third object'}};
router.get('/', function(req, res, next) {
console.log("building response body")
console.log(data)
res.json(data);
});