使用数据库的节点肥皂服务(依赖性问题)

node-soap service that uses database (dependency issues)

首先,这是我在 Node.js 中的第一个项目,所以我对它还很陌生。

我有一个我想做的项目,它是一个连接到 Oracle 数据库的 SOAP(我知道,SOAP...向后兼容,是吧?)接口。

所以我有一个 WSDL 描述了这些函数的外观(地址和内容的验证)并且我有一个到数据库的连接。

现在,当使用 SOAP npm 模块时,您需要创建一个服务器并使用允许您响应请求的服务进行侦听。我有一个包含我的 SOAP 服务的单独文件,但该服务应该对数据库进行查询以获取其结果。

我如何将 'injecting' 我的数据库服务整合到我的 SOAP 服务中,以便每当完成 SOAP 调用时,它都会将其编排到我的数据库服务中的正确方法?

我的代码是这样的:

databaseconnection.js

var oracledb = require('oracledb');
var dbConfig = require('../../config/development');

var setup = exports.setup = (callback) => {
    oracledb.createPool (
        {
            user          : dbConfig.user,
            password      : dbConfig.password,
            connectString : dbConfig.connectString
        },
        function(err, pool)
        {
            if (err) { console.error(err.message); return; }
            pool.getConnection (
                function(err, connection)
                {
                    if (err) {
                        console.error(err.message);
                        return callback(null);
                    }
                    return callback(connection);
                }
            );
        }
    );
};

databaseservice.js

var DatabaseService = function (connection) {
    this.database = connection;
};

function doSomething(callback) {
    if (!this.database) { console.log('Database not available.'); return; }
    this.database.execute('SELECT * FROM HELP', function(err, result) {
        callback(result);
    });
};

module.exports = {
    DatabaseService: DatabaseService,
    doSomething: doSomething
};

soapservice.js

var myService = {
    CVService: {
        CVServicePort: {
            countryvalidation: function (args, cb, soapHeader) {
                console.log('Validating Country');
                cb({
                    name: args
                });
            }
        }
    }
};

server.js

app.use(bodyParser.raw({type: function(){return true;}, limit: '5mb'}));
app.listen(8001, function(){
databaseconnection.setup((callback) => {
    var temp = databaseservice.DatabaseService(callback);
    soapservice.Init(temp);
    var server = soap.listen(app, '/soapapi/*', soapservice.myService, xml);

    databaseservice.doSomething((result) => {
    console.log(result.rows.length, ' results.');
    });
});
console.log('Server started');
});

我如何将 databaseservice.doSomething() 添加到 countryvalidation soap 方法而不是 'name: args'?

另外:我觉得我的代码结构非常非常混乱。我试图找到一些关于如何在线构建代码的好例子,但至于服务和数据库连接 + 组合它们,我没有找到太多。非常欢迎对此结构提出任何意见。毕竟我是来学习的。

谢谢

迪特

我首先看到的有点不对劲的是databaseconnection.js。它应该创建池,仅此而已。一般来说,应该在请求进入时从池中获取连接,并在完成使用它来为该请求提供服务时释放。

看看这个 post:https://jsao.io/2015/02/real-time-data-with-node-js-socket-io-and-oracle-database/ 您可以查看一些示例应用程序,它们可能会有所帮助。在两个演示之间,"employees-cqn-demo" 应用程序组织得更好。

请记住,post 现在有点过时了,我们对驱动程序进行了增强,现在更易于使用。我的清单上有一个 post 关于如何使用 Node.js 和 Oracle 数据库构建 RESTful API,但我还没有机会去做。