NodeJS Soap service - Вернуть синхронный ответ клиента - PullRequest
0 голосов
/ 25 мая 2020

Я размещаю Soap сервер в NodeJS через библиотеку 'strong- soap'. Я последовал стандартному примеру, приведенному здесь в официальной документации: strong- soap

Он отлично работает, когда я немедленно отправляю ответ. Однако моя реализация функции веб-службы требует вызова БД для обновления записи перед отправкой ответа.

Моя Soap Реализация службы выглядит примерно так:

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"
                        }
                    });
                }
            );
        }
    }
}

Проблема, с которой я сталкиваюсь, заключается в том, что ответ, который я возвращаю из внутренней функции после вызова БД (успех или ошибка) не возвращается обратно клиенту SOAP. Поток вызовов завершается после вызова внутренней функции. Я не могу сделать функцию обратным вызовом (асинхронной), так как вызывающий (SOAP клиент) ожидает «синхронного» ответа. Что мне не хватает?

Как сделать вызов синхронным, чтобы ответ отправлялся обратно клиенту только после обновления БД?

Заранее благодарим за помощь!

1 Ответ

0 голосов
/ 26 мая 2020

Мне удалось выяснить проблему с моим кодом.

  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)
            });
        }
    }
...