Comment exécuter la procédure stockée cosmos db dans nodejs?

Sep 24 2020

J'essaye d'exécuter la procédure stockée dans nodejs. J'utilise cosmosclient et quand j'ai essayé d'exécuter le code mais je ne suis pas en mesure de récupérer la réponse ou les données. Voici mon morceau de code.

private async executeSprocInternal(sprocName, sprocParams) {
        try {
            var sprocLink = this.sprocsUrl + '/' + sprocName;  //sprocLink:: dbs/testDB/colls/test-container/sprocs/test
            var _stdate;
            var _partition:any ={} ;
            if (conf.partition == true)   _partition.partitionKey = 'id';
           
            if (this.showLog == true) _stdate = new Date();
            return new Promise((resolve, reject) => { 
                this.container.scripts.storedProcedure(sprocName).execute(sprocLink,sprocParams,_partition).then((results) =>{
                    if (this.showLog == true) {
                        console.log('Completed Proc ', sprocName, ' in ', ((new Date()).getTime() - _stdate.getTime()), ' msec');
                        }
                    resolve(results);
                })
                .catch((error) =>{
                    console.log("exequeryerror")
                    reject(error)
                })
            });

        } catch (e) {
            console.log(2,e)
            return new Promise((resolve, reject) => {
                 reject(e);
             });
        }
    }

Merci pour l'aide.

Réponses

SteveZhao Sep 25 2020 at 15:44

Selon la documentation de l' API , sprocLink ne doit pas être transmis.

function execute (partitionKey: any, params ?: any [], options ?: RequestOptions)

De plus, vous devez transmettre la valeur de votre clé de partition (je suppose que «id» est votre clé de partition).

J'ai essayé ceci et cela peut fonctionner correctement, vous pouvez essayer:

    async function executeSprocInternal(sprocName, sprocParams) {
        try {
    
            var sprocLink = 'dbs/Test/colls/data/sprocs' + '/' + sprocName;//sprocLink:: dbs/testDB/colls/test-container/sprocs/test
            var _stdate = new Date();;
            var partitionKey  = 'fruit';
        
            return new Promise((resolve, reject) => {
                container.scripts.storedProcedure(sprocName).execute(partitionKey,sprocParams).then((results) => {
                    console.log('Completed Proc ', sprocName, ' in ', ((new Date()).getTime() - _stdate.getTime()), ' msec');
                    resolve(results);
                })
                    .catch((error) => {
                        console.log("exequeryerror")
                        reject(error)
                    })
            });
        } catch (e) {
            console.log(2, e)
            return new Promise((resolve, reject) => {
                reject(e);
            });
        }
    }

    executeSprocInternal("getData", "success").then((message) => {console.log(message);})

J'espère que cela peut vous aider.


Mettre à jour

Voici mon échantillon:

Comme le montre la capture d'écran, /categoryest mon chemin de clé de partition, fruitest ma valeur de clé de partition. Il vous suffit de passer "fruit" à executeméthode, comme ceci:

container.scripts.storedProcedure(sprocName).execute("fruit",sprocParams)