【问题标题】:How to render object from REST response如何从 REST 响应中呈现对象
【发布时间】:2017-09-02 10:23:24
【问题描述】:

我想渲染到用户界面/打印到控制台记录一些来自 GET 响应的对象值。

我在服务器端使用 Node JS,在客户端使用 HTML + JS。

因为我的目标是渲染数据并且请求类型是跨域的,所以我不能使用“获取”功能。 我执行它的唯一选择是通过“JSONP”数据类型发送它。

实际上,请求被发送并且响应也通过回调接收,但是我的代码是打印“null”到控制台而不是响应数据。 当我尝试使用 JSON.parse() 时,它收到了“parseerror”。

预期结果是仅获取图像标记值 (2.0.90) 并将其打印在控制台日志中/将其呈现到 UI。

 async function uiChecking() {
    let index;
    const hostsDock = [qa + dockers];
    let lengthVal = hostsDock.length;
    for (let hostIndxD = 0; hostIndxD < lengthVal; hostIndxD++) {
        index = hostIndxD;
        let url = hostsDock[hostIndxD];

        $.ajax({
            url: url,
            dataType: 'jsonp',
        }).done( function(data) {
            console.log("A " + data);
        });

    }
}

**Server.js **

var express = require('express');
var cors = require('cors');
var app = express();
var path = require("path");
var fetch = require('fetch-cookie')(require('node-fetch'));
var btoa = require('btoa');
var http = require('http');


var corsOptionsDelegate = function (req, callback) {
    var corsOptions;
    if (whitelist.indexOf(req.header('Origin')) !== -1) {
        corsOptions = { origin: true } // reflect (enable) the requested origin in the CORS response
    }else{
        corsOptions = { origin: false } // disable CORS for this request
    }
    callback(null, data , corsOptions) // callback expects two parameters: error and options
};

app.engine('.html', require('ejs').__express);
app.set('views', __dirname + '/view');
app.set('view engine', 'html');


app.use(express.static(path.join(__dirname, 'public')));

app.get('/', function(req, res){
    res.render('index');
    res.render('logo');
    res.writeHead(200, {'Content-Type': 'application/json'});
});

// app.get('/products/:id', cors(corsOptionsDelegate), function (req, res, next) {
//     res.json({msg: 'This is CORS-enabled for a whitelisted domain.'})
// });


app.get('/data/:id', function (req, res, next) {
    var opts = {
        host: config.alertService.host,
        port: config.alertService.port,
        method: 'GET',
        path: '/DataService/rest/receiveData/' + req.params.id
    }

    var reqGet = http.request(opts, function (dataResponse) {
        var responseString = '';
        dataResponse.on('data', function (data) {
            responseString += data;
        });
        var response = {x:[],y:[],z:[],t:[]};
        dataResponse.on('end', function () {
            var responseObject = JSON.parse(responseString);
            var accs = responseObject.data.listPCS;
            for(var i in accs){
                response.x.push(accs[i].accX);
                response.z.push(accs[i].accY);
                response.y.push(accs[i].accZ);
                response.t.push(accs[i].timestamp);
            }
            res.jsonp(response);
        });
    });
    reqGet.end();
    reqGet.on('error', function (e) {
        console.error(e);
    });
});

if (app.settings.env === 'production') {
    app.error(function(err, req, res) {
        res.render('new404.html', {
            status: 500,
            locals: {
                error: error
            }
        });
    });
}

app.listen(8033, function () {
    console.log('CORS-enabled web server listening on port 8033')
});

【问题讨论】:

  • 您不能访问该对象吗?像; success: function (data) { console.log(data[0].id); }
  • 它也不能正常工作,它会收到“parseerror”和控制台记录 - {readyState: 4, setRequestHeader: ƒ, getAllResponseHeaders: ƒ, getResponseHeader: ƒ, overrideMimeType: ƒ, ...}
  • 这不需要是异步函数。
  • 仍然不呈现响应数据,现在它收到“未定义”:/ @programmer5000
  • app.listen(8033, …) 在 node.js 代码中 & cannot load production.com:2375/containers/json … localhost:8033 is therefore not allowed access 在错误消息中表明端口 8033 服务器正在为您的前端代码提供服务,并且正在向运行在 production.com:2375 的不同服务器发送请求。因此,您在 8033 端口服务器上所做的 CORS 配置无关紧要——因为它不是您的前端代码向其发送请求的服务器。相反,您需要将 CORS 支持添加到 production.com:2375 服务器——因为那是您实际发送请求的服务器。

标签: javascript json ajax rest


【解决方案1】:

您需要遍历响应以返回结果,例如

$.each(data, function(index) {
    console.log(data[index].ui);
    console.log(data[index].id); console.log(data[index].Name);
});

【讨论】:

  • 谢谢,但它收到所有参数的“未定义”:/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 2019-06-28
  • 2020-07-02
  • 1970-01-01
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多