如何在整个api调用中使用node.js中的全局错误处理代码

Prem

我有一个具有多个功能的api调用。除了可以为每种方法应用错误处理之外,还可以使用将错误发送给UI开发人员的全局错误处理代码。

代码如下:

app.post('/billing/pricingdetails', function (req, res) {
    console.log('pricing api called');
    var workload = req.body;
    var resourcelevelPricing = {};
    var response = {};
    var workloadinfo = {
        workloadId: workload.workloadId,
        ownerId: workload.ownerId,
        uniqueName: workload.uniqueName,
        name: workload.name
    }
    var pricing = {}
    var allresourceIdentifiers;

    if (workload.elements && workload.elements.length > 0) {
        var elementlevelpricingSummary = {};
        var elementArray = [];
        var allresourceIdentifierArray = [];
        var elementinfo = {};
        var metadataModified = {};
        var elementsParam = workload.elements;
        // handle configurable resource
        var configurableElementarray = [];

        // create array of all the elements in workloadjson - to be used for resourcelevel (instance/image), charamountunitlevel, resourcetypelevel pricing detail
        for (var index in elementsParam) {
            // if condition skips the uri of configurable resources - handle configurable resource
            if(!elementsParam[index].parameters.ResourceParameters) 
            {
                allresourceIdentifierArray.push(elementsParam[index].uri);

                if (elementsParam[index].parameters.imageUri) {
                allresourceIdentifierArray.push(elementsParam[index].parameters.imageUri);
                }
            }
        }

        var allresourceIdentifiers = allresourceIdentifierArray.join(',');

        // call the functionalities that gives the each level of pricing detail synchronously to construct the workload json 
        async.series([
        function (callback) {

            getpricingSummary(elementsParam, function (err, workloadinfo) {
                if(err){

                }
                else
                {
                callback(null, workloadinfo);
                }

            });
        },
        function (callback) {

            getPricingforResourceIdentifiers(allresourceIdentifiers, function (err, pricingDetail) {

                pricing.resourceLevel = pricingDetail;
                callback(null, pricingDetail);

            });
        },
        function (callback) {

            getchargeamountunitlevelPricing(allresourceIdentifiers, function (err, pricingDetail) {

                //merge configurable resource with concrete resource pricing details - handle configurable resource
                if(configurableElementarray.length > 0)
                {

                    var concatednatedArray = pricingDetail.concat(configurableElementarray);

                    var finalResult = [];

                    var i = concatednatedArray.reduce(function (result, o) {

                    var key  = o.chargeAmountUnit + o.currencyCode;

                    if (!(key in result)) {
                    result.arr.push(result[key] = o);
                    finalResult.push(result);
                    } 

                    else {
                    result[key].chargeAmount += Number(o.chargeAmount);
                    }

                    return result;
                    }, { arr: [] }).arr;

                    pricing.chargeamountunitLevel = i;

                    trace.info(i);

                }
                else
                {
                    pricing.chargeamountunitLevel = pricingDetail;  
                }
                callback(null, pricingDetail);

            });
        },
        function (callback) {

            getresourcetypelevelPricing(allresourceIdentifiers, function (err, pricingDetail) {

                if(configurableElementarray.length > 0)
                {

                    var concatednatedArray = pricingDetail.concat(configurableElementarray);

                    var i = concatednatedArray.reduce(function (result, o) {

                    var key  = o.chargeAmountUnit + o.currencyCode + o.Name;

                    if (!(key in result)) {
                    result.arr.push(result[key] = o);
                    } 

                    else {
                    result[key].chargeAmount += o.chargeAmount;
                    }

                    return result;
                    }, { arr: [] }).arr;

                    pricing.resourcetypeLevel = i;
                    trace.info(i);

                }
                else
                {
                    pricing.resourcetypeLevel = pricingDetail;
                }
                callback(null, pricingDetail);

            });
        }
        ],
        function (err, result) {

            workloadinfo.pricing = pricing;
            res.send(workloadinfo);

        });

        // get element level pricing summary for each elements (vm/vs) in the array within workload json - the output to be appended within metadata of workload json
        function getpricingSummary(elementsParam, callback) {

            async.forEachSeries(elementsParam, createResponse, function (err,result) {

                return callback(null, result);

            });
        };

        // this method called by async.forEachSeries passing each elements (vm/vs) of workload
        function createResponse(elements, callback) {

            var resourceIdentifierArray = [];

            elementinfo = elements;

            resourceIdentifierArray.push(elements.uri);

            if (elements.parameters.imageUri) {

                resourceIdentifierArray.push(elements.parameters.imageUri);
            }

            // build string of resourceIdentifier (instance/image) for input element
            var resourceIdentifiers = resourceIdentifierArray.join(',');

            console.log(resourceIdentifiers);

            if(elements.parameters.ResourceParameters)
            {
                trace.info('1');

                trace.info(elements.parameters.ResourceParameters);

                var configJson = JSON.parse(elements.parameters.ResourceParameters);

                trace.info(Number(configJson.cpuCount));

                metadataModified = elements.metadata;

                // TODO : Remove this hard-coding
                elementlevelpricingSummary.Name = 'Hardware';

                if(configJson.totalUnitPrice)
                {
                    var chargeAmount = configJson.totalUnitPrice;

                    elementlevelpricingSummary.chargeAmount = Math.round(chargeAmount * 100)/100;
                }
                if(configJson.ChargeAmountUnit)
                {
                    var chargeAmountUnit = configJson.ChargeAmountUnit;

                    elementlevelpricingSummary.chargeAmountUnit = configJson.ChargeAmountUnit;
                }
                if(configJson.CurrencyCode)
                {
                    var currencyCode = configJson.CurrencyCode;

                    elementlevelpricingSummary.currencyCode = configJson.CurrencyCode;
                }   

                metadataModified.pricingSummary = elementlevelpricingSummary;

                configurableElementarray.push(elementlevelpricingSummary);

                // delete original metadata from workload json (to be replaced by metadata containing pricing summary)
                delete elementinfo.metadata;

                elementinfo.metadata = metadataModified;

                elementArray.push(elementinfo);

                // global workloadinfo variable is appended with array of elements with its pricing summary within metadata of respective elements
                workloadinfo.elements = elementArray;

                return callback();
            }

            else
            {
                // Get element level pricing summary
                mysql.elementlevelpricing(resourceIdentifiers, conn, function (result) {

                elementlevelpricingSummary = result;

                metadataModified = elements.metadata;

                metadataModified.pricingSummary = elementlevelpricingSummary;

                // delete original metadata from workload json (to be replaced by metadata containing pricing summary)
                delete elementinfo.metadata;

                elementinfo.metadata = metadataModified;

                elementArray.push(elementinfo);

                // global workloadinfo variable is appended with array of elements with its pricing summary within metadata of respective elements
                workloadinfo.elements = elementArray;

                return callback(null,workloadinfo);

                });
            }
        };

        function getPricingforResourceIdentifiers(resourceIdentifiers, callback) {

            mysql.pricingDetail(resourceIdentifiers, conn, function (result) {

                return callback(null, result);

            });
        };

        function getchargeamountunitlevelPricing(resourceIdentifiers, callback) {

            mysql.chargeamountunitlevelPricing(resourceIdentifiers, conn, function (result) {

                return callback(null, result);

            });
        };

        function getresourcetypelevelPricing(resourceIdentifiers, callback) {

            mysql.resourcetypelevelPricing(resourceIdentifiers, conn, function (result) {

                return callback(null, result);

            });
        };

    };

});
罗伯特克莱普

使用Express,您可以安装错误处理程序,该错误处理程序将在您的任何路由中发生错误时调用:

// somewhere at the end of your middleware/route chain
app.use(function(err, req, res, next) {
  res.send(500, err.message); // or whatever you want to send back
});

仍然最好重新抛出代码中发生的任何错误:

if (err) throw err;

另外,由于您正在使用async,因此您始终可以将错误传播回去:

if (err) return callback(err);

并处理最终回调中的错误。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在整个api调用中使用node.js中的全局错误处理代码

来自分类Dev

如何在Orchard中扩展错误处理代码?

来自分类Dev

如何测试全局AJAX错误处理

来自分类Dev

如何在Redux中创建全局错误处理程序并在需要时覆盖它?

来自分类Dev

在Node.js中的yEnc上的错误处理

来自分类Dev

承诺中的 Node.js mysql 错误处理

来自分类Dev

如何在全局错误处理中使用$ http.post?

来自分类Dev

ASP.Net中的AJAX Web服务-如何进行全局错误处理?

来自分类Dev

全局错误处理在服务工作者中如何工作?

来自分类Dev

如何在Node.js中使用异步瀑布进行API调用

来自分类Dev

如何在错误处理代码中出错的函数中使用参数?

来自分类Dev

如何简化Rust中这种可怕的嵌套错误处理代码?

来自分类Dev

Node.js函数中的域错误处理程序修饰符

来自分类常见问题

使用node.js流进行错误处理

来自分类Dev

Backbone.js save()中如何进行错误处理?

来自分类Dev

Swift 2中使用Alamofire进行错误处理

来自分类Dev

如何在 node.js 中使用 dynamodb 扫描操作获取整个表数据

来自分类Dev

如何在ANTLR4中实现错误处理

来自分类Dev

从Salesforce API隔离错误处理中的错误消息

来自分类Dev

如何在Node.js中使用XHR API?

来自分类Dev

如何使用Spring MVC / Spring Boot编写适当的全局错误处理程序

来自分类Dev

用Express在Node JS中进行简单的错误处理?

来自分类Dev

Node.js错误处理以检查属性值

来自分类Dev

Express:在错误处理程序中调用next

来自分类Dev

在axios调用后Express中的错误处理

来自分类Dev

Express:在错误处理程序中调用next

来自分类Dev

如何在node.js中使用混合的C ++和.Net dll?(错误:abort()已被调用)

来自分类Dev

在 Node 中打开 PDF 时的错误处理

来自分类Dev

如何在ExpressJS中触发路由器错误处理程序而不是默认错误处理程序

Related 相关文章

  1. 1

    如何在整个api调用中使用node.js中的全局错误处理代码

  2. 2

    如何在Orchard中扩展错误处理代码?

  3. 3

    如何测试全局AJAX错误处理

  4. 4

    如何在Redux中创建全局错误处理程序并在需要时覆盖它?

  5. 5

    在Node.js中的yEnc上的错误处理

  6. 6

    承诺中的 Node.js mysql 错误处理

  7. 7

    如何在全局错误处理中使用$ http.post?

  8. 8

    ASP.Net中的AJAX Web服务-如何进行全局错误处理?

  9. 9

    全局错误处理在服务工作者中如何工作?

  10. 10

    如何在Node.js中使用异步瀑布进行API调用

  11. 11

    如何在错误处理代码中出错的函数中使用参数?

  12. 12

    如何简化Rust中这种可怕的嵌套错误处理代码?

  13. 13

    Node.js函数中的域错误处理程序修饰符

  14. 14

    使用node.js流进行错误处理

  15. 15

    Backbone.js save()中如何进行错误处理?

  16. 16

    Swift 2中使用Alamofire进行错误处理

  17. 17

    如何在 node.js 中使用 dynamodb 扫描操作获取整个表数据

  18. 18

    如何在ANTLR4中实现错误处理

  19. 19

    从Salesforce API隔离错误处理中的错误消息

  20. 20

    如何在Node.js中使用XHR API?

  21. 21

    如何使用Spring MVC / Spring Boot编写适当的全局错误处理程序

  22. 22

    用Express在Node JS中进行简单的错误处理?

  23. 23

    Node.js错误处理以检查属性值

  24. 24

    Express:在错误处理程序中调用next

  25. 25

    在axios调用后Express中的错误处理

  26. 26

    Express:在错误处理程序中调用next

  27. 27

    如何在node.js中使用混合的C ++和.Net dll?(错误:abort()已被调用)

  28. 28

    在 Node 中打开 PDF 时的错误处理

  29. 29

    如何在ExpressJS中触发路由器错误处理程序而不是默认错误处理程序

热门标签

归档