[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-e086c44b-a2d7-44c2-8b69-e4ac9e1c6eb9":3,"$fLrb6RRNVbnblbvBHxB8AV_lMRYjupIAMkkXEJxso1mM":43},{"id":4,"title":5,"description":6,"categoryId":7,"moduleId":8,"tags":9,"prompt":10,"icon":11,"source":12,"sourceUrl":13,"authorId":14,"authorName":15,"isPublic":16,"stars":17,"runs":18,"createdAt":19,"updatedAt":19,"module":20,"category":27,"packages":34},"e086c44b-a2d7-44c2-8b69-e4ac9e1c6eb9","azure-storage-queue-ts","Azure队列存储JavaScript\u002FTypeScript SDK（@azure\u002Fstorage-queue）用于消息队列操作。用于在队列中发送、接收、预览和删除消息。","cat_coding_devops","mod_coding","sickn33,coding","---\nname: azure-storage-queue-ts\ndescription: Azure Queue Storage JavaScript\u002FTypeScript SDK (@azure\u002Fstorage-queue) for message queue operations. Use for sending, receiving, peeking, and deleting messages in queues.\nrisk: unknown\nsource: community\ndate_added: '2026-02-27'\n---\n\n# @azure\u002Fstorage-queue (TypeScript\u002FJavaScript)\n\nSDK for Azure Queue Storage operations — send, receive, peek, and manage messages in queues.\n\n## Installation\n\n```bash\nnpm install @azure\u002Fstorage-queue @azure\u002Fidentity\n```\n\n**Current Version**: 12.x  \n**Node.js**: >= 18.0.0\n\n## Environment Variables\n\n```bash\nAZURE_STORAGE_ACCOUNT_NAME=\u003Caccount-name>\nAZURE_STORAGE_ACCOUNT_KEY=\u003Caccount-key>\n# OR connection string\nAZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=...\n```\n\n## Authentication\n\n### DefaultAzureCredential (Recommended)\n\n```typescript\nimport { QueueServiceClient } from \"@azure\u002Fstorage-queue\";\nimport { DefaultAzureCredential } from \"@azure\u002Fidentity\";\n\nconst accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME!;\nconst client = new QueueServiceClient(\n  `https:\u002F\u002F${accountName}.queue.core.windows.net`,\n  new DefaultAzureCredential()\n);\n```\n\n### Connection String\n\n```typescript\nimport { QueueServiceClient } from \"@azure\u002Fstorage-queue\";\n\nconst client = QueueServiceClient.fromConnectionString(\n  process.env.AZURE_STORAGE_CONNECTION_STRING!\n);\n```\n\n### StorageSharedKeyCredential (Node.js only)\n\n```typescript\nimport { QueueServiceClient, StorageSharedKeyCredential } from \"@azure\u002Fstorage-queue\";\n\nconst accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME!;\nconst accountKey = process.env.AZURE_STORAGE_ACCOUNT_KEY!;\n\nconst sharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey);\nconst client = new QueueServiceClient(\n  `https:\u002F\u002F${accountName}.queue.core.windows.net`,\n  sharedKeyCredential\n);\n```\n\n### SAS Token\n\n```typescript\nimport { QueueServiceClient } from \"@azure\u002Fstorage-queue\";\n\nconst accountName = process.env.AZURE_STORAGE_ACCOUNT_NAME!;\nconst sasToken = process.env.AZURE_STORAGE_SAS_TOKEN!;\n\nconst client = new QueueServiceClient(\n  `https:\u002F\u002F${accountName}.queue.core.windows.net${sasToken}`\n);\n```\n\n## Client Hierarchy\n\n```\nQueueServiceClient (account level)\n└── QueueClient (queue level)\n    └── Messages (send, receive, peek, delete)\n```\n\n## Queue Operations\n\n### Create Queue\n\n```typescript\nconst queueClient = client.getQueueClient(\"my-queue\");\nawait queueClient.create();\n\n\u002F\u002F Or create if not exists\nawait queueClient.createIfNotExists();\n```\n\n### List Queues\n\n```typescript\nfor await (const queue of client.listQueues()) {\n  console.log(queue.name);\n}\n\n\u002F\u002F With prefix filter\nfor await (const queue of client.listQueues({ prefix: \"task-\" })) {\n  console.log(queue.name);\n}\n```\n\n### Delete Queue\n\n```typescript\nawait queueClient.delete();\n\n\u002F\u002F Or delete if exists\nawait queueClient.deleteIfExists();\n```\n\n### Get Queue Properties\n\n```typescript\nconst properties = await queueClient.getProperties();\nconsole.log(\"Approximate message count:\", properties.approximateMessagesCount);\nconsole.log(\"Metadata:\", properties.metadata);\n```\n\n### Set Queue Metadata\n\n```typescript\nawait queueClient.setMetadata({\n  department: \"engineering\",\n  priority: \"high\",\n});\n```\n\n## Message Operations\n\n### Send Message\n\n```typescript\nconst queueClient = client.getQueueClient(\"my-queue\");\n\n\u002F\u002F Simple message\nawait queueClient.sendMessage(\"Hello, World!\");\n\n\u002F\u002F With options\nawait queueClient.sendMessage(\"Delayed message\", {\n  visibilityTimeout: 60, \u002F\u002F Hidden for 60 seconds\n  messageTimeToLive: 3600, \u002F\u002F Expires in 1 hour\n});\n\n\u002F\u002F JSON message (must be string)\nconst task = { type: \"process\", data: { id: 123 } };\nawait queueClient.sendMessage(JSON.stringify(task));\n```\n\n### Receive Messages\n\n```typescript\n\u002F\u002F Receive up to 32 messages (default: 1)\nconst response = await queueClient.receiveMessages({\n  numberOfMessages: 10,\n  visibilityTimeout: 30, \u002F\u002F 30 seconds to process\n});\n\nfor (const message of response.receivedMessageItems) {\n  console.log(\"Message ID:\", message.messageId);\n  console.log(\"Content:\", message.messageText);\n  console.log(\"Dequeue Count:\", message.dequeueCount);\n  console.log(\"Pop Receipt:\", message.popReceipt);\n  \n  \u002F\u002F Process the message...\n  \n  \u002F\u002F Delete after processing\n  await queueClient.deleteMessage(message.messageId, message.popReceipt);\n}\n```\n\n### Peek Messages\n\nPeek without removing from queue (no visibility timeout).\n\n```typescript\nconst response = await queueClient.peekMessages({\n  numberOfMessages: 5,\n});\n\nfor (const message of response.peekedMessageItems) {\n  console.log(\"Message ID:\", message.messageId);\n  console.log(\"Content:\", message.messageText);\n  \u002F\u002F Note: No popReceipt - cannot delete peeked messages\n}\n```\n\n### Update Message\n\nExtend visibility timeout or update content.\n\n```typescript\n\u002F\u002F Receive a message\nconst response = await queueClient.receiveMessages();\nconst message = response.receivedMessageItems[0];\n\nif (message) {\n  \u002F\u002F Update content and extend visibility\n  const updateResponse = await queueClient.updateMessage(\n    message.messageId,\n    message.popReceipt,\n    \"Updated content\",\n    60 \u002F\u002F New visibility timeout in seconds\n  );\n  \n  \u002F\u002F Use new popReceipt for subsequent operations\n  console.log(\"New pop receipt:\", updateResponse.popReceipt);\n}\n```\n\n### Delete Message\n\n```typescript\n\u002F\u002F After receiving\nconst response = await queueClient.receiveMessages();\nconst message = response.receivedMessageItems[0];\n\nif (message) {\n  await queueClient.deleteMessage(message.messageId, message.popReceipt);\n}\n```\n\n### Clear All Messages\n\n```typescript\nawait queueClient.clearMessages();\n```\n\n## Message Processing Patterns\n\n### Basic Worker Pattern\n\n```typescript\nasync function processQueue(queueClient: QueueClient): Promise\u003Cvoid> {\n  while (true) {\n    const response = await queueClient.receiveMessages({\n      numberOfMessages: 10,\n      visibilityTimeout: 30,\n    });\n\n    if (response.receivedMessageItems.length === 0) {\n      \u002F\u002F No messages, wait before polling again\n      await sleep(5000);\n      continue;\n    }\n\n    for (const message of response.receivedMessageItems) {\n      try {\n        await processMessage(message.messageText);\n        await queueClient.deleteMessage(message.messageId, message.popReceipt);\n      } catch (error) {\n        console.error(`Failed to process message ${message.messageId}:`, error);\n        \u002F\u002F Message will become visible again after timeout\n      }\n    }\n  }\n}\n\nasync function processMessage(content: string): Promise\u003Cvoid> {\n  const task = JSON.parse(content);\n  \u002F\u002F Process task...\n}\n\nfunction sleep(ms: number): Promise\u003Cvoid> {\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n```\n\n### Poison Message Handling\n\n```typescript\nconst MAX_DEQUEUE_COUNT = 5;\n\nasync function processWithPoisonHandling(\n  queueClient: QueueClient,\n  poisonQueueClient: QueueClient\n): Promise\u003Cvoid> {\n  const response = await queueClient.receiveMessages({\n    numberOfMessages: 10,\n    visibilityTimeout: 30,\n  });\n\n  for (const message of response.receivedMessageItems) {\n    if (message.dequeueCount > MAX_DEQUEUE_COUNT) {\n      \u002F\u002F Move to poison queue\n      await poisonQueueClient.sendMessage(message.messageText);\n      await queueClient.deleteMessage(message.messageId, message.popReceipt);\n      console.log(`Moved message ${message.messageId} to poison queue`);\n      continue;\n    }\n\n    try {\n      await processMessage(message.messageText);\n      await queueClient.deleteMessage(message.messageId, message.popReceipt);\n    } catch (error) {\n      console.error(`Processing failed (attempt ${message.dequeueCount}):`, error);\n    }\n  }\n}\n```\n\n### Batch Processing with Visibility Extension\n\n```typescript\nasync function processBatchWithExtension(queueClient: QueueClient): Promise\u003Cvoid> {\n  const response = await queueClient.receiveMessages({\n    numberOfMessages: 1,\n    visibilityTimeout: 60,\n  });\n\n  const message = response.receivedMessageItems[0];\n  if (!message) return;\n\n  let popReceipt = message.popReceipt;\n\n  \u002F\u002F Start visibility extension timer\n  const extensionInterval = setInterval(async () => {\n    try {\n      const updateResponse = await queueClient.updateMessage(\n        message.messageId,\n        popReceipt,\n        message.messageText,\n        60 \u002F\u002F Extend by another 60 seconds\n      );\n      popReceipt = updateResponse.popReceipt;\n    } catch (error) {\n      console.error(\"Failed to extend visibility:\", error);\n    }\n  }, 45000); \u002F\u002F Extend every 45 seconds\n\n  try {\n    await longRunningProcess(message.messageText);\n    await queueClient.deleteMessage(message.messageId, popReceipt);\n  } finally {\n    clearInterval(extensionInterval);\n  }\n}\n```\n\n## Message Encoding\n\nBy default, messages are Base64 encoded. You can customize this:\n\n```typescript\nimport { QueueClient } from \"@azure\u002Fstorage-queue\";\n\n\u002F\u002F Custom encoder\u002Fdecoder for plain text\nconst queueClient = new QueueClient(\n  `https:\u002F\u002F${accountName}.queue.core.windows.net\u002Fmy-queue`,\n  credential,\n  {\n    messageEncoding: \"text\", \u002F\u002F \"base64\" (default) or \"text\"\n  }\n);\n\n\u002F\u002F Or with custom encoder\nconst customQueueClient = new QueueClient(\n  `https:\u002F\u002F${accountName}.queue.core.windows.net\u002Fmy-queue`,\n  credential,\n  {\n    messageEncoding: {\n      encode: (message: string) => Buffer.from(message).toString(\"base64\"),\n      decode: (message: string) => Buffer.from(message, \"base64\").toString(),\n    },\n  }\n);\n```\n\n## SAS Token Generation (Node.js only)\n\n### Generate Queue SAS\n\n```typescript\nimport {\n  QueueSASPermissions,\n  generateQueueSASQueryParameters,\n  StorageSharedKeyCredential,\n} from \"@azure\u002Fstorage-queue\";\n\nconst sharedKeyCredential = new StorageSharedKeyCredential(accountName, accountKey);\n\nconst sasToken = generateQueueSASQueryParameters(\n  {\n    queueName: \"my-queue\",\n    permissions: QueueSASPermissions.parse(\"raup\"), \u002F\u002F read, add, update, process\n    startsOn: new Date(),\n    expiresOn: new Date(Date.now() + 3600 * 1000), \u002F\u002F 1 hour\n  },\n  sharedKeyCredential\n).toString();\n\nconst sasUrl = `https:\u002F\u002F${accountName}.queue.core.windows.net\u002Fmy-queue?${sasToken}`;\n```\n\n### Generate Account SAS\n\n```typescript\nimport {\n  AccountSASPermissions,\n  AccountSASResourceTypes,\n  AccountSASServices,\n  generateAccountSASQueryParameters,\n} from \"@azure\u002Fstorage-queue\";\n\nconst sasToken = generateAccountSASQueryParameters(\n  {\n    services: AccountSASServices.parse(\"q\").toString(), \u002F\u002F queue\n    resourceTypes: AccountSASResourceTypes.parse(\"sco\").toString(),\n    permissions: AccountSASPermissions.parse(\"rwdlacupi\"),\n    expiresOn: new Date(Date.now() + 24 * 3600 * 1000),\n  },\n  sharedKeyCredential\n).toString();\n```\n\n## Error Handling\n\n```typescript\nimport { RestError } from \"@azure\u002Fstorage-queue\";\n\ntry {\n  await queueClient.sendMessage(\"test\");\n} catch (error) {\n  if (error instanceof RestError) {\n    switch (error.statusCode) {\n      case 404:\n        console.log(\"Queue not found\");\n        break;\n      case 400:\n        console.log(\"Bad request - message too large or invalid\");\n        break;\n      case 403:\n        console.log(\"Access denied\");\n        break;\n      case 409:\n        console.log(\"Queue already exists or being deleted\");\n        break;\n      default:\n        console.error(`Storage error ${error.statusCode}: ${error.message}`);\n    }\n  }\n  throw error;\n}\n```\n\n## TypeScript Types Reference\n\n```typescript\nimport {\n  \u002F\u002F Clients\n  QueueServiceClient,\n  QueueClient,\n\n  \u002F\u002F Authentication\n  StorageSharedKeyCredential,\n  AnonymousCredential,\n\n  \u002F\u002F SAS\n  QueueSASPermissions,\n  AccountSASPermissions,\n  AccountSASServices,\n  AccountSASResourceTypes,\n  generateQueueSASQueryParameters,\n  generateAccountSASQueryParameters,\n\n  \u002F\u002F Messages\n  DequeuedMessageItem,\n  PeekedMessageItem,\n  QueueSendMessageResponse,\n  QueueReceiveMessageResponse,\n  QueueUpdateMessageResponse,\n\n  \u002F\u002F Queue\n  QueueItem,\n  QueueGetPropertiesResponse,\n\n  \u002F\u002F Errors\n  RestError,\n} from \"@azure\u002Fstorage-queue\";\n```\n\n## Message Limits\n\n| Limit | Value |\n|-------|-------|\n| Max message size | 64 KB |\n| Max visibility timeout | 7 days |\n| Max time-to-live | 7 days (or -1 for infinite) |\n| Max messages per receive | 32 |\n| Default visibility timeout | 30 seconds |\n\n## Best Practices\n\n1. **Use DefaultAzureCredential** — Prefer AAD over connection strings\u002Fkeys\n2. **Always delete after processing** — Prevent duplicate processing\n3. **Handle poison messages** — Move failed messages to a dead-letter queue\n4. **Use appropriate visibility timeout** — Set based on expected processing time\n5. **Extend visibility for long tasks** — Update message to prevent timeout\n6. **Use JSON for structured data** — Serialize objects to JSON strings\n7. **Check dequeueCount** — Detect repeatedly failing messages\n8. **Use batch receive** — Receive multiple messages for efficiency\n\n## Platform Differences\n\n| Feature | Node.js | Browser |\n|---------|---------|---------|\n| `StorageSharedKeyCredential` | ✅ | ❌ |\n| SAS generation | ✅ | ❌ |\n| DefaultAzureCredential | ✅ | ❌ |\n| Anonymous\u002FSAS access | ✅ | ✅ |\n| All message operations | ✅ | ✅ |\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.\n","","imported","https:\u002F\u002Fgithub.com\u002Fsickn33\u002Fantigravity-awesome-skills","user_system_seed","SkillOPIC",true,209,346,"2026-05-16 13:07:59",{"id":8,"name":21,"slug":22,"icon":23,"description":24,"sort":25,"createdAt":26},"编程开发","coding","mdi-code-braces","代码生成、调试、审查，提升开发效率",2,"2026-05-16 12:53:40",{"id":7,"name":28,"slug":29,"icon":30,"description":31,"moduleId":8,"sort":32,"skillCount":33,"createdAt":26},"DevOps","devops","mdi-cog-outline","CI\u002FCD、容器化、部署运维",3,162,[35],{"id":36,"skillId":4,"version":37,"fileName":38,"fileSize":39,"filePath":40,"fileHash":41,"manifest":42,"createdAt":19},"628b2546-f9dc-44d5-b94e-e2ec24b9844c","1.0.0","azure-storage-queue-ts.zip",3991,"uploads\u002Fskills\u002Fe086c44b-a2d7-44c2-8b69-e4ac9e1c6eb9\u002Fazure-storage-queue-ts.zip","968a619374142fbc8947242281113383003c987f6486f6bca7685e9548498150","[{\"path\":\"SKILL.md\",\"isDirectory\":false,\"size\":13452}]",{"code":44,"message":45,"data":46},200,"success",{"items":47,"stats":48,"page":51},[],{"averageRating":49,"totalRatings":49,"ratingCounts":50},0,[49,49,49,49,49],{"limit":52,"offset":49,"hasMore":53,"nextOffset":52,"ratedOnly":16},15,false]