0

我通过“strong-soap”库在 NodeJS 中托管 Soap 服务器。我在这里遵循官方文档中给出的标准示例:strong-soap

当我立即发回回复时,它工作正常。但是,我的 Web 服务功能实现需要在发送响应之前调用 DB 来更新记录。

我的肥皂服务实现是这样的:

var myService = {
UpdateService: {
    UpdatePort: {
        UpdateCps: function(args) {
             //return {
             //        StatusCode: 0,
             //        StatusDesc: "Update successful"
             //};

            utils.connectDB(function (err, connection) {
                if(err){
                    return {
                        StatusCode: 1,
                        StatusDesc: "Error connecting to DB"
                    };
                }
                connection.execute(
                    queryString, 
                    {
                        args
                    },{
                        autoCommit: true
                    }, function (err, results) {
                        if (err) {
                            utils.releaseConnection(connection);
                            return {
                                StatusCode: 1,
                                StatusDesc: "Error Updating Request ID"
                            };
                        }
                        utils.releaseConnection(connection);
                        return {
                            StatusCode: 0,
                            StatusDesc: "Update successful"
                        }
                    });
                }
            );
        }
    }
}

我面临的问题是我在 DB 调用(成功或错误)之后从内部函数返回的响应没有返回给 SOAP 客户端。调用内部函数后,调用流程终止。我无法将该函数设为回调(异步),因为调用者(SOAP 客户端)期待“同步”响应。我错过了什么?

如何使调用同步,以便仅在数据库更新后将响应发送回客户端?

在此先感谢您的帮助!

4

1 回答 1

0

我设法找出我的代码的问题。

  1. 我不得不从

    UpdateCps: function(args)UpdateCps: function(args, callback). 我对回调的解释是调用者会传递一个回调(这是错误的)。

  2. 我使用“承诺”来确保仅在数据库操作完成后才调用“回调”。

这两个更改解决了我的问题。最终代码如下:

UpdateCps: function(args, callback) {
            let soapResponse = {};


            let promise = new Promise((resolve, reject) => {
                utils.connectDB(function (err, connection) {
                    if(err){
                        soapResponse = {
                            StatusCode: 1,
                            StatusDesc: "Error connecting to DB"
                        }
                        resolve(soapResponse);
                        return;
                    }
                    connection.execute(
                        queryString,
                        args,
                        {
                            autoCommit: true
                        },
                        function (err, results) {
                            if (err) {
                                logger.error('Error Updating Request ID');
                                connection.release(function (err) {
                                    if (err) {
                                        logger.error(err.message);
                                    }
                                });

                                soapResponse = {
                                    StatusCode: 1,
                                    StatusDesc: "Error Updating Request ID"
                                }
                                resolve(soapResponse);
                                return;
                            }
                            utils.releaseConnection(connection);
                            soapResponse = {
                                StatusCode: 0,
                                StatusDesc: "Update successful for Request ID"
                            }
                            resolve(soapResponse);
                        });
                    });
                });

            promise.then(result => {
                soapResponse = result;
                callback(soapResponse)
            });
        }
    }
于 2020-05-26T08:36:33.810 回答