通过ajax客户端未定义响应,但响应字符串正确

时间:2018-12-16 00:22:26

标签: javascript ajax express

我正在使用虚拟服务器设置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客户端没有看到。怎么了?

1 个答案:

答案 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);
});