从Promise对象(服务器端)获取价值到客户端index.html

埃尔维拉

我想知道如何将一个Promise对象转换为字符串。我正在调用一个返回XML对象的API,使用axios和transform进行模板化。我的应用程序使用Express作为应用程序框架。我从诺言中的.then中有一个console.log,它在命令行中返回控制台中的数据。

但是,当我想在index.html中处理这些数据时,我在控制台中得到了一个Promise对象。我如何才能将数据的“覆盖”部分从Promise对象放入index.html中?

服务器控制台日志记录: 在此处输入图片说明

在浏览器中登录控制台: 在此处输入图片说明

项目文件:

./routes/index.js

router.get('/metadata', function(req,res,next){
    var info = metadata.getMetadataOnix(params);
    console.log('info:'+info);
    res.json({ test : info });
});

index.html,其中包含一个ajax get,该get获取对document.ready的调用

 $.get("/metadata", function(data){
      // call to metadata
});

metadata-onix.js-我在其中调用api的文件

const axios = require('axios');
const transform = require('camaro');

exports.getMetadataOnix = function (id) {
    const template = {
        uitgever: '/Product/PublishingDetail/Publisher/PublisherName/text()',
        cover: "./Product/CollateralDetail/SupportingResource[ResourceContentType=01]/ResourceVersion/ResourceLink/text()"
    }

    return axios({
        method: 'get',
        url: 'https://someapi/getMetadataOnix/'+id,
        transformResponse: [function (data) {
            "use strict";
            data = transform(data, template);
            return data;
        }],
    }).catch(function(err){
        // log errors
        console.log('error:'+err);
    }).then(function(resp){
        var cover = '';
        cover = resp.data.cover;
        console.log('Cover from book:'+JSON.stringify(resp.data.cover));
        return cover;
    });
}
TJ人群

那里有一些问题。与您的问题有关的主要问题是您使用的结果getMetadataOnix不正确。它返回一个Promise,因此您必须使用该Promise。一种方法是通过then

router.get('/metadata', function(req,res,next){
    var info = metadata.getMetadataOnix('9789024576791').then(function(info) {
        console.log('info:'+info);
        res.json({ test : info });
    });
});

不必担心这意味着get在发送响应之前您的回调将返回;没问题,Express就是为此而设计的。

另外,有关错误处理的两个问题:

首先,您可以使用/在此处拒绝转换为分辨率undefined

exports.getMetadataOnix = function (id) {
    // ...

    return axios({
        // ...
    }).catch(function(err){           // <===
        // log errors                 // <===
        console.log('error:'+err);    // <===
    }).then(function(resp){
        var cover = '';
        cover = resp.data.cover;
        console.log('Cover from book:'+JSON.stringify(resp.data.cover));
        return cover;
    });
}

记住这一点,thencatch创建处理程序链,其中链中的每个步骤都会转换通过它的值。通过将其.catch放置在任何位置,可以将拒绝catch处理程序转换为具有从处理程序返回的任何值的分辨率由于您未明确返回“ 1”,因此最终结果为“” undefined

由于您的then处理程序不会进行检查,因此在尝试使用resp.data.cover时会抛出错误,因为resp它将是undefined有趣的是,这将分辨率转换回拒绝(从未处理过)。

相反,根本不处理错误。承诺规则之一是,您要么将承诺链返回给调用方,要么处理错误,但不能同时处理两者。(您可能会将错误转换为另一种错误,但是除非您实际上可以解决问题,否则您不会将其转换为解决方案。)

而是在get回调中处理它所以:

exports.getMetadataOnix = function (id) {
    const template = {
        uitgever: '/Product/PublishingDetail/Publisher/PublisherName/text()',
        cover: "./Product/CollateralDetail/SupportingResource[ResourceContentType=01]/ResourceVersion/ResourceLink/text()"
    }

    return axios({
        method: 'get',
        url: 'https://someapi/getMetadataOnix/'+id,
        transformResponse: [function (data) {
            "use strict";
            data = transform(data, template);
            return data;
        }],
    // No .catch here
    }).then(function(resp){
        var cover = '';
        cover = resp.data.cover;
        console.log('Cover from book:'+JSON.stringify(resp.data.cover));
        return cover;
    });
}

router.get('/metadata', function(req,res,next){
    var info = metadata.getMetadataOnix(params)
        .then(function(info) {
            console.log('info:'+info);
            res.json({ test : info });
        })
        .catch(function(err) {
            // Log error, etc.
            // Use `res.send` or `res.json` or similar to send error reply
        });
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

php的服务器端关联数组到html的客户端端

构建 HTML 客户端 VS 服务 HTML 服务器端?

在ASP.NET服务器端还是客户端中的HTML控件?

脱机HTML的客户端渲染与服务器端渲染

将HTML元素从服务器端添加回客户端

数据生成中处理html创建的最佳位置是什么(服务器端或客户端)

如何在Node.js中从客户端调用服务器端函数(例如html按钮onclick)?

MVC Razor是否在客户端或服务器端的视图中为模板生成HTML?

设置客户端到服务器(和数据库)的连接并更新客户端 html

HTML5:我是否需要同时在客户端和服务器端验证Web表单,还是可以只在客户端进行验证?

如何编写从服务器到客户端的答案(Java、HTML)

服务器端对HTML的反应

使用jQuery成功进行客户端验证后,如何提交html表单以进行服务器端验证?

如何在 html 模板 (ASP.NET) 中的 Javascript 饼图中使用 AJAX 方法显示从客户端检索的动态服务器端数据

客户端数据到服务器端

通过Javascript输出JSON内容时,我应该在服务器端还是客户端上转义HTML?

如何从服务器发送要在客户端浏览器中打开的 html 文件?

HTML到Node.js中的PNG服务器端

服务器端无法读取从Javascript到HTML的值

请求参数中的 html 元素在服务器端未检索到

反应服务器端渲染还是静态index.html?

在服务器端使用Node JS解析HTML

数据表服务器端-使用HTML

在服务器端使用HTML模板

服务器端呈现的HTML-> JS表?

通过 Javascript 插入服务器端呈现的 HTML

HTML5服务器端事件-显示

从React应用进行路由以获取从车把生成的服务器端呈现的HTML

如何从 html 中获取数据从 AppScript 中返回到服务器端代码