Как выполнить хранимую процедуру cosmos db в nodejs?

Sep 24 2020

Я пытаюсь выполнить хранимую процедуру в 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);
             });
        }
    }

Спасибо за помощь.

Ответы

SteveZhao Sep 25 2020 at 15:44

Согласно документации API , sprocLink нельзя передавать.

функция 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);})

Надеюсь, это поможет тебе.


Обновить

Вот мой образец:

Как показано на скриншоте, /categoryэто мой путь ключа раздела, fruitэто значение моего ключа раздела. Вам просто нужно передать "фрукт" в executeметод, например:

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