Как я могу разобрать URI BLOB-объекта Azure в nodejs / javascript? - PullRequest
0 голосов
/ 31 мая 2018

Мне нужно проанализировать URI BLOB-объекта Azure в nodejs и извлечь имя учетной записи хранения, имя контейнера и имя BLOB-объекта.

Я исследовал как azure-sdk-for-node , так и azure-storage-node , но я не нашел способа сделать это.

В случае, если Blob URI недействителен, я также хотел бы обнаружить это, поэтому, вероятно, регулярное выражение (если возможно) будет хорошим способомto go.

Некоторые примеры BLRI URI:

  1. https://myaccount.blob.core.windows.net/mycontainer/myblob
  2. http://myaccount.blob.core.windows.net/myblob
  3. https://myaccount.blob.core.windows.net/$root/myblob

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Вы можете использовать url.parse.

Основная причина для меня - избегать использования регулярных выражений, а также легче понять, прочитать и изменить.

Вот пример кода:

const url = require('url')

const parseAzureBlobUri = (blobUrl) => {
    let uri = url.parse(blobUrl)

    // Extract the storage account name
    let storageAccountName = uri.hostname.split('.')[0]        

    // Remove the 1st trailing slash then extract segments
    let segments = uri.pathname.substring(1).split('/')

    // If only one segment, this is the blob name
    if(segments.length === 1){
        return {
            storageAccountName,
            containerName: '$root',
            blobName: segments[0]
        }
    }

    // get the container name
    let containerName = segments[0]

    // Remove the containername from the segments
    segments.shift()

    return {
        storageAccountName,
        containerName,
        blobName: segments.join('/')
    }
}
0 голосов
/ 31 мая 2018

Следуя спецификации из Azure , я придумал следующую функцию ( gist ), которая использует регулярное выражение для анализа BLOB-объекта URI, а также выдает ошибку, если BLUI URI недопустим.

Имя учетной записи хранения и имя контейнера должны быть полностью правильными / точными, только имя большого двоичного объекта, которое я оставил свободным, поскольку его более сложно определить.

/**
 * Validates and parses given blob uri and returns storage account, 
 * container and blob names.
 * @param {string} blobUri - Valid Azure storage blob uri.
 * @returns {Object} With following properties:
 *   - {string} storageAccountName
 *   - {string} containerName
 *   - {string} blobName
 * @throws {Error} If blobUri is not valid blob uri.
 */
const parseAzureBlobUri = (blobUri) => {
  const ERROR_MSG_GENERIC = 'Invalid blob uri.'

  const storageAccountRegex = new RegExp('[a-z0-9]{3,24}')
  const containerRegex = new RegExp('[a-z0-9](?!.*--)[a-z0-9-]{1,61}[a-z0-9]')
  const blobRegex = new RegExp('.{1,1024}')  // TODO: Consider making this one more precise.
  const blobUriRegex = new RegExp(
    `^http[s]?:\/\/(${ storageAccountRegex.source })\.blob.core.windows.net\/`
    + `(?:(\$root|(?:${ containerRegex.source }))\/)?(${ blobRegex.source })$`
  )
  const match = blobUriRegex.exec(blobUri)
  if (!match) throw Error(ERROR_MSG_GENERIC)

  return {
    storageAccountName: match[1],
    // If not specified, then it is implicitly root container with name $root.
    containerName: match[2] || '$root',
    blobName: match[3]
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...