Функция Azure с @ azure / cosmos возвращает «Недопустимые аргументы, переданные в LocationInfo» - PullRequest
0 голосов
/ 02 ноября 2019

Я уже некоторое время запускаю функциональное приложение, запрашивающее cosmosDB в Azure. Несколько дней назад мое приложение начало возвращать ошибки LocationInfo (без каких-либо изменений в коде. Повторное развертывание приложения, кажется, работает в течение нескольких минут, но после этого проблемы возвращаются. Создание нового приложения-функции также не решило мою проблему.

Я использую следующий код: я вызываю функцию getStatus со значением, которое, я уверен, допустимо:

const { CosmosClient } = require('@azure/cosmos')
const databaseNameVariable = process.env.TelemetryDbName || 'DBname'
const collectionVariable = process.env.TelemetryCollectionName || 'Telemetry'

// Creates and returns the DB container ready to execute queries with
function getTelemetryContainer (database = databaseNameVariable, collection = collectionVariable) {
  const endpoint = process.env.DBTelemetryDbUrl
  const key = process.env.DBTelemetryDbConnectionKey
  const cosmosClient = new CosmosClient({ endpoint, key })

  return cosmosClient.databases.createIfNotExists({ id: database })
    .then((response) => {
      const { database } = response
      return database.containers.createIfNotExists({ id: collection })
    })
    .then(response => response.container)
}

// Gets Telemetry container and executes query
function getTelemetryData (querySpec, databaseName, containerName) {
  return getTelemetryContainer(databaseName, containerName)
    .then(container => container.items.query(querySpec).toArray())
}

// Builds query and returns query results for 'Status' queries
function getStatus (somevalue) {
  const baseQuerySpec = {
    query: `
    SELECT TOP 1 t['timestamp'], t['somevalue'], t['value']
    FROM Telemetry t
    WHERE t['somevalue'] = @somevalue
    AND t['type'] = 'myType'
    `,
    parameters: [
      {
        name: '@somevalue',
        value: somevalue
      }
    ]
  }
  return getTelemetryData(baseQuerySpec)
    .then((response) => {
      return orderResultsByTimestamp(response)
    })
}

Трассировка стека, которую я получаю после того, как приложение функции былона некоторое время появится следующая трассировка стека:

2019-11-02T08:32:32.389 [Error] Executed 'Functions.GetStatus' (Failed, Id=22945cf5-0827-4d1c-93b2-6abf444d4846)
Result: Failure
Exception: Error: Invalid arguments passed to LocationInfo
Stack: Error: Invalid arguments passed to LocationInfo
    at new LocationInfo (D:\home\site\wwwroot\node_modules\@azure\cosmos\lib\src\LocationInfo.js:41:19)
    at new LocationCache (D:\home\site\wwwroot\node_modules\@azure\cosmos\lib\src\LocationCache.js:28:29)
    at new GlobalEndpointManager (D:\home\site\wwwroot\node_modules\@azure\cosmos\lib\src\globalEndpointManager.js:28:30)
    at new CosmosClient (D:\home\site\wwwroot\node_modules\@azure\cosmos\lib\src\CosmosClient.js:76:39)
    at getTelemetryContainer (D:\home\site\wwwroot\lib\MyCosmosClient.js:9:24)
    at getTelemetryData (D:\home\site\wwwroot\lib\MyCosmosClient.js:58:10)
    at getStatus (D:\home\site\wwwroot\lib\MyCosmosClient.js:175:10)
    at module.exports (D:\home\site\wwwroot\GetStatus\index.js:17:12)
    at WorkerChannel.invocationRequest (D:\Program Files (x86)\SiteExtensions\Functions\2.0.12858\32bit\workers\node\worker-bundle.js:16506:26)
    at ClientDuplexStream.WorkerChannel.eventStream.on (D:\Program Files (x86)\SiteExtensions\Functions\2.0.12858\32bit\workers\node\worker-bundle.js:16386:30)
    at ClientDuplexStream.emit (events.js:198:13)
    at addChunk (_stream_readable.js:288:12)
    at readableAddChunk (_stream_readable.js:269:11)
    at ClientDuplexStream.Readable.push (_stream_readable.js:224:10)
    at Object.onReceiveMessage (D:\Program Files (x86)\SiteExtensions\Functions\2.0.12858\32bit\workers\node\worker-bundle.js:20394:19)
    at InterceptingListener.module.exports.InterceptingListener.recvMessageWithContext (D:\Program Files (x86)\SiteExtensions\Functions\2.0.12858\32bit\workers\node\worker-bundle.js:19709:19)
2019-11-02T08:32:32.147 [Information] Executing 'Functions.GetStatus' (Reason='This function was programmatically called via the host APIs.', Id=22945cf5-0827-4d1c-93b2-6abf444d4846)

Код, инициализирующий клиента космоса, в значительной степени является прямой копией из документации по nodeJS. Есть идеи?

ОБНОВЛЕНИЕ: Я имеюобновил код так, чтобы при инициализации файла .js создавался космоклиент, как это было предложено. К сожалению, это не решило нашу проблему:

const { CosmosClient } = require('@azure/cosmos')
const databaseNameVariable = process.env.TelemetryDbName || 'DBname'
const collectionVariable = process.env.TelemetryCollectionName || 'Telemetry'
const cosmosClient = new CosmosClient({ endpoint, key })
const container = cosmosClient.database(databaseNameVariable).container(collectionVariable)

// Gets Telemetry container and executes query
function getTelemetryData (querySpec) {
  return container.items.query(querySpec).fetchAll()
}

// Builds query and returns query results for 'Status' queries
function getStatus (somevalue) {
  const baseQuerySpec = {
    query: `
    SELECT TOP 1 t['timestamp'], t['somevalue'], t['value']
    FROM Telemetry t
    WHERE t['somevalue'] = @somevalue
    AND t['type'] = 'myType'
    `,
    parameters: [
      {
        name: '@somevalue',
        value: somevalue
      }
    ]
  }
  return getTelemetryData(baseQuerySpec)
    .then((response) => {
      return orderResultsByTimestamp(response)
    })
}
...