我想知道如何将一个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;
});
}
那里有一些问题。与您的问题有关的主要问题是您使用的结果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;
});
}
记住这一点,then
并catch
创建处理程序链,其中链中的每个步骤都会转换通过它的值。通过将其.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] 删除。
我来说两句