Я уже некоторое время запускаю функциональное приложение, запрашивающее 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)
})
}