gpt4 book ai didi

javascript - Node.js 在 API 调用返回后执行某些操作

转载 作者:太空宇宙 更新时间:2023-11-04 00:48:18 27 4
gpt4 key购买 nike

我正在使用 aws-lib npm 包调用 Amazon 产品 API。我试图获取该调用的结果,然后将该信息保存到我的数据库中,我一直遇到的问题是,如果我在尝试将调用结果设置为产品时使用大量参数进行调用,我会得到未定义的结果,因为 API 调用尚未完全返回。我尝试使用回调并 promise 在执行其他操作之前确保 API 结果完全返回,但我无法让它工作。

这是我的代码的当前状态

  var aws = require('aws-lib');
var host = "http://webservices.amazon.co.uk/onca/xml"
var prodAdvOptions = {
host: "webservices.amazon.co.uk",
region: "UK"
};

// provide credentials
var prodAdv = aws.createProdAdvClient(myKey, myPass, myId, prodAdvOptions);

.post(function(req, res) {

// Options for the Amazon API
var options = {
ItemId: req.body.itemId,
ResponseGroup: "OfferFull, ItemAttributes",
Condition: "New",
MerchantId: "Amazon"
}
getInfo(options, saveProduct, res);
}

function getInfo(options, saveProduct, res){

// Make call to the API
prodAdv.call("ItemLookup", options, function(err, result) {
//create new product
var product = new Product();
product.name = result.name
//assign lots more things to the product - these will return undefined which is the problem
saveProduct(product);
})
};

function saveProduct(product){
// save product to the database
};

这是使用 aws-lib 对 API 的调用

exports.init = init;

function init(genericAWSClient) {
return createProdAdvClient;

function createProdAdvClient(accessKeyId, secretAccessKey, associateTag, options) {
options = options || {};
var client = genericAWSClient({
host: options.host || "ecs.amazonaws.com",
path: options.path || "/onca/xml",
accessKeyId: accessKeyId,
secretAccessKey: secretAccessKey,
secure: options.secure
});

return {
client: client,
call: call
};

function call(action, query, callback) {
query["Operation"] = action
query["Service"] = "AWSECommerceService"
query["Version"] = options.version || '2009-10-01'
query["AssociateTag"] = associateTag;
query["Region"] = options.region || "US"
return client.call(action, query, callback);
}
}
}

我认为我没有正确使用回调,或者需要另一个回调来将结果分配给产品,但无法找出哪里出错了。

感谢您的帮助,这两天我一直在努力解决这个问题。

最佳答案

最初在没有 Promise 的情况下了解发生的情况可能会更容易,然后在达成理解后使用 Promise。

程序流程的一个选项是:

  1. 发出 POST 请求并调用 post 回调
  2. getInfo 被调用
  3. prodAdv 被异步调用,这意味着必须提供一个回调,说明对 aws 的调用完成后要执行的操作。
  4. 在该回调中调用了另一个异步函数saveProductsaveProduct 必须注册回调,以便您可以在数据库调用完成后执行某些操作。
  5. 在该回调问题中 res.send
<小时/>
   api.post('somePost', function(req, resp) {
makeAWSCallAsync(params, function(err, awsRespProducts) {
saveProductsAsync(awsRespProducts, function(err, dbResp) {
// db call has been completed
resp.send();
});
});
});

这是非常简单的,并且应该检查一路上的错误。一旦它起作用,您可以重构以使用 Promise,这将删除嵌套的回调。

关于javascript - Node.js 在 API 调用返回后执行某些操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33675516/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com