如何在Node.js中执行Cosmos DB存储过程?

问题描述

我正在尝试在nodejs中执行存储过程。我正在使用cosmosclient,当我尝试执行代码时,却无法获取响应或数据。这是我的代码

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

感谢您的帮助。

解决方法

根据API documentation,不应传递sprocLink。

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

此外,您还需要传递分区密钥的值。(我想'id'是您的分区密钥。)

我已经尝试过了,它可以正常工作,您可以尝试一下:

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

希望这可以为您提供帮助。


更新

这是我的样品:

enter image description here

如屏幕截图所示,/category是我的分区密钥路径,fruit是我的分区密钥值。您只需要将“水果”传递给execute方法,就像这样:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...