cancel
Showing results for 
Search instead for 
Did you mean: 
Subscribe

Hello folks,

I'm building an app on Cloud Platform (CF) using Node.js/Express. This thing has a /db module containing a entity definition (books-model.cds) and /srv that runs a node.js app on server.js that should read data declared on db module.

According to this documentation the package @sap/cds should help me do exactly that, using the statements below:

cds.importEntities([
    { $entity: "xsds.test.cds::ds_test.e1" },
    { $entity: "xsds.test.cds::ds_test.e2",
      $fields: {
          a: { $association: "xsds.test.cds::ds_test.e2",
               $viaBacklink: "b" }
      }
    }
], callback);
function callback(error, entities) {
    var E1 = entities["xsds.test.cds::ds_test.e1"];
    var E2 = entities["xsds.test.cds::ds_test.e2"];
    // ...
}

Thing is, @sap/cds module v2.10 doesn't seem to think that it is responsible for doing that. This version only handles the build and deployment of .cds files (to hdbcds et etc).

In a old version of this module, before going to npm repository, it was called "sap-cds" and it did provided this .importEntity method.

Does someone know what would be the equivalent of sap-cds on npm.sap.com, or even if it exists?

So far, I'm able to interact with the database using @sap/xsenv and @sap/hdbext.

import xsenv = require('@sap/xsenv') import hdbext = require('@sap/hdbext')    
const services = xsenv.getServices({ hana:'plcockpit-hdi' }) 

express.use('/', hdbext.middleware(services.hana))    
express.get('/', (req, res) => {
        req.db.exec('SELECT * FROM \"com.acme::MyLibrary.Books\"', function (err, rows) {
            res.json({
                result: JSON.stringify(rows[0])
            })
        })
    })

(Code is a simplified version of the original)

Although it works, I would like to know if is there a more "high-level" api to interact with the CDS layer.

Thanks

0 Likes
View Entire Topic
tobias_mitter2
Explorer
0 Likes

Hi Onu,

I am working on the same thing as you. When you work with HANA, you will probably want to use XSA with HDI concept. This means when you deploy your database part, an HDI container will be created. You then have to make sure, that your node.js module requires the database container. The cloud foundry environment will then inject the connection setting of the hdi container into your node.js module environment variables. This is standard cloud foundry development with XSA. You can then get the generated technical user und password for the container and use them in your above example. But...this does not solve the problem when deploying the application to the cloud platform.

How are we going to tell the cds to use the environment variables for the connection instead of the fixed values in the package.json? I am just trying to figure out how to fill the options parameter of the cds.connect function. If not parameters are given, is seems it will get them from the package.json.

Hope you could follow.

Cheers,

Tobi

ulyssesbonfim
Explorer
0 Likes

Hello Tobias,


| How are we going to tell the cds to use the environment variables for the connection instead of the fixed values in the package.json?

The access to HDI container will be done via xsenv, like below (see my original post)

const xsenv = require("@sap/xsenv")

// Read container reference 
const services = xsenv.getServices({ hana:'mycontainer-hdi' }) 

// Use hana service middleware 
express.use('/', hdbext.middleware(services.hana)) 

This should provide your application the access to the right HDI container.

Hope this help you out