Как прочитать «Добавить большой двоичный объект из хранилища BLOB-объектов Azure» в строку с Node.js SDK? - PullRequest
0 голосов
/ 04 января 2019

Я следую приведенному здесь примеру https://github.com/Azure/azure-storage-js/blob/master/blob/samples/basic.sample.js о считывании BLOB-объекта из хранилища BLOB-объектов Azure в строку с использованием Node.js SDK.

Большой двоичный объект, который я пытаюсь прочитать, является дополнительным.

Прежде всего чтение потока в строку занимает очень много времени, и в конце я получаю ошибку HTTP 412.

Я также задавал этот вопрос здесь: https://github.com/Azure/azure-storage-js/issues/51

Я делаю это с Node.js v10.14.1, и я использую SDK @azure / storage-blob @ 10.3.0.

Мой код здесь:

const {
  Aborter,
  BlobURL,
  ContainerURL,
  SharedKeyCredential,
  ServiceURL,
  StorageURL,
} = require('@azure/storage-blob');
const format = require('date-fns/format');

async function streamToString(readableStream) {
  return new Promise((resolve, reject) => {
    const chunks = [];
    readableStream.on('data', (data) => {
      chunks.push(data.toString());
    });
    readableStream.on('end', () => {
      resolve(chunks.join(''));
    });
    readableStream.on('error', reject);
  });
}

async function run() {
  const accountName = 'xxxstor';
  const accountKey = 'omitted';
  const credential = new SharedKeyCredential(accountName, accountKey);
  const pipeline = StorageURL.newPipeline(credential);
  const serviceURL = new ServiceURL(
    `https://${accountName}.blob.core.windows.net`,
    pipeline
  );
  const containerName = 'request-logs';
  const containerURL = ContainerURL.fromServiceURL(serviceURL, containerName);
  const blobName = `${format(new Date(), 'YYYY-MM-DD[.txt]')}`;
  const blobURL = BlobURL.fromContainerURL(containerURL, blobName);
  console.log('Downloading blob...');
  const response = await blobURL.download(Aborter.none, 0);
  console.log('Reading response to string...');
  const body = await streamToString(response.);
  console.log(body.length);
}

run().catch((err) => {
  console.error(err);
});

Я получаю следующую ошибку:

{ Error: Unexpected status code: 412
    at new RestError (C:\projects\xxx\RequestLogViewer\node_modules\@azure\ms-rest-js\dist\msRest.node.js:1397:28)
    at C:\projects\xxx\RequestLogViewer\node_modules\@azure\ms-rest-js\dist\msRest.node.js:1849:37
    at process._tickCallback (internal/process/next_tick.js:68:7)
  code: undefined,
  statusCode: 412,
  request:
  WebResource {
    streamResponseBody: true,
    url:
      'https://xxxstor.blob.core.windows.net/request-logs/2019-01-04.txt',
    method: 'GET',
    headers: HttpHeaders { _headersMap: [Object] },
    body: undefined,
    query: undefined,
    formData: undefined,
    withCredentials: false,
    abortSignal:
      a {
        _aborted: false,
        children: [],
        abortEventListeners: [Array],
        parent: undefined,
        key: undefined,
        value: undefined },
    timeout: 0,
    onUploadProgress: undefined,
    onDownloadProgress: undefined,
    operationSpec:
      { httpMethod: 'GET',
        path: '{containerName}/{blob}',
        urlParameters: [Array],
        queryParameters: [Array],
        headerParameters: [Array],
        responses: [Object],
        isXML: true,
        serializer: [Serializer] } },
  response:
  { body: undefined,
    headers: HttpHeaders { _headersMap: [Object] },
    status: 412 },
  body: undefined }

1 Ответ

0 голосов
/ 11 января 2019

Этот вопрос был решен в проблеме GitHub https://github.com/Azure/azure-storage-js/issues/51 Скопируйте решение из проблемы GitHub сюда.

blobURL.download () попытается загрузить блоб с HTTP-запросом Get в поток. Когда поток неожиданно заканчивается из-за разрыва сети, повторная попытка возобновить чтение потока с точки прерывания с новым HTTP-запросом Get.

Во втором HTTP-запросе будет использоваться условный заголовок IfMatch с ETag большого двоичного объекта, возвращенным в первом запросе, чтобы убедиться, что большой двоичный объект не изменится после второй попытки. В противном случае будет возвращен условный заголовок 412, который не соответствует ошибке. Эта строгая стратегия используется, чтобы избежать проблем с целостностью данных, таких как блоб, может быть полностью переписан кем-то другим. Однако эта стратегия, по-видимому, не позволяет читать постоянно обновляемый файл журнала при повторных попытках.

Хотя я не думаю, что это ошибка, но мы должны заставить этот сценарий работать на вас. Пожалуйста, попробуйте следующее решение: сначала сделайте снимок большого двоичного файла с добавлением и прочитайте его с большого двоичного объекта

const blobURL = BlobURL.fromContainerURL(containerURL, blobName);
console.log('Downloading blob...');
const snapshotResponse = await blobURL.createSnapshot(Aborter.none);
const snapshotURL = blobURL.withSnapshot(snapshotResponse.snapshot);
const response = await snapshotURL.download(Aborter.none, 0);
console.log('Reading response to string...', snapshotURL.blobContext.length);
const body = await streamToString(response.readableStreamBody);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...