biscuit765
biscuit765

Reputation: 92

Trying to upload zip file to azure storage via node js

Trying to upload file to azure storage blob using nodejs but facing promise issue. below is my code facing issue while uploading zip file to azure blob storage need to convert this code to callback function or .then function

var re = /\.zip/;

fs.readdir("/tmp/", function(err, files) {
    if (err) {
        console.log( "Could not list the directory.", err)
        process.exit( 1 )
    }
    console.log("files",files)
    
    var matches = files.filter( function(text) { return re.test(text) } )
    console.log("These are the files you have", matches)
    var numFiles = matches.length
    console.log(numFiles);

    if ( numFiles ) {
        // Read in the file, convert it to base64, store to S3

        for(let i = 0; i < numFiles; i++ ) {
    
          uploadFileToBlob(matches[i])
          .then((result: any) => {
              console.log('result');
              console.log(result);
            })
            .catch((error: any) => {
              console.log(error);
            });
        }
    }
})
const uploadFileToBlob = async (file: any) => {
          const { AbortController } = require("@azure/abort-controller");
          const { AnonymousCredential, BlobServiceClient, newPipeline } = require("@azure/storage-blob");
          const account = 'string';
          const accountSas = "sastoken";
          const localFilePath = file;
          const pipeline = newPipeline(new AnonymousCredential(), {
            // httpClient: MyHTTPClient, // A customized HTTP client implementing IHttpClient interface
            retryOptions: { maxTries: 4 }, // Retry options
            userAgentOptions: { userAgentPrefix: "AdvancedSample V1.0.0" }, // Customized telemetry string
            keepAliveOptions: {
              // Keep alive is enabled by default, disable keep alive by setting false
              enable: false
            }
          });
          const blobServiceClient = new BlobServiceClient(
            `https://${account}.blob.core.windows.net${accountSas}`,
            pipeline
          );
          const containerName = 'quickstart';
          const containerClient = blobServiceClient.getContainerClient(containerName);
          const blobName = file;
          const blockBlobClient = containerClient.getBlockBlobClient(blobName);
          console.log("blockBlobClient",blockBlobClient);
          try {
                  const result =await  blockBlobClient.uploadFile(localFilePath, {
                    blockSize: 4 * 1024 * 1024, // 4MB block size
                    concurrency: 20, // 20 concurrency
                    onProgress: (ev: any) => console.log(ev)
                  });
                  console.log("uploadFile succeeds");
                  return result;
                } catch (err) {
                  console.log(
                    `uploadFile failed, requestId - ${err.details.requestId}, statusCode - ${err.statusCode}, errorCode - ${err.details.errorCode}`
                  );
                  throw err;
                }
}

getting output

Promise { <pending> }

I tried to write code in callback function or .then function but getting same error and same code is working in local machine

Upvotes: 1

Views: 944

Answers (1)

Gaurav Mantri
Gaurav Mantri

Reputation: 136196

Please change the following lines of code:

await blockBlobClient.uploadFile(localFilePath, {
  blockSize: 4 * 1024 * 1024, // 4MB block size
  concurrency: 20, // 20 concurrency
  onProgress: (ev) => console.log(ev)
});
console.log("uploadFile succeeds");

to

const result = await blockBlobClient.uploadFile(localFilePath, {
  blockSize: 4 * 1024 * 1024, // 4MB block size
  concurrency: 20, // 20 concurrency
  onProgress: (ev) => console.log(ev)
});
console.log("uploadFile succeeds");
return result;

And then call your uploadFileToBlob method like:

uploadFileToBlob('filename.zip')
.then((result) => {
  console.log('result');
  console.log(result);
})
.catch((error) => {
  console.log(error);
});

UPDATE

Here's the complete code I used. I was able to upload the file successfully:

const uploadFileToBlob = async (file) => {
    const { AbortController } = require("@azure/abort-controller");
    const { AnonymousCredential, BlobServiceClient, newPipeline } = require("@azure/storage-blob");
    const account = 'account-name';
    const accountSas = '?sv=2020-04-08&ss=b&srt=sco&se=2021-03-08T18%3A30%3A00Z&sp=rwdxftlacup&sig=pT1d1NJQdu3bcnPA37voTCyQ6jKnmNVYgo1wyiYspDc%3D';
    const localFilePath = file;
    const pipeline = newPipeline(new AnonymousCredential(), {
      // httpClient: MyHTTPClient, // A customized HTTP client implementing IHttpClient interface
      retryOptions: { maxTries: 4 }, // Retry options
      userAgentOptions: { userAgentPrefix: "AdvancedSample V1.0.0" }, // Customized telemetry string
      keepAliveOptions: {
        // Keep alive is enabled by default, disable keep alive by setting false
        enable: false
      }
    });
    const blobServiceClient = new BlobServiceClient(
      `https://${account}.blob.core.windows.net${accountSas}`,
      pipeline
    );
    const containerName = 'container-name';
    const containerClient = blobServiceClient.getContainerClient(containerName);
    const blobName = file;
    const blockBlobClient = containerClient.getBlockBlobClient(blobName);
    console.log("blockBlobClient",blockBlobClient);
    try {
      const result = await blockBlobClient.uploadFile(localFilePath, {
        blockSize: 4 * 1024 * 1024, // 4MB block size
        concurrency: 20, // 20 concurrency
        onProgress: (ev) => console.log(ev)
      });
      console.log("uploadFile succeeds");
      return result;
    } catch (err) {
      console.log(
        `uploadFile failed, requestId - ${err.details.requestId}, statusCode - ${err.statusCode}, errorCode - ${err.details.errorCode}`
      );
      throw err;
    }
}

uploadFileToBlob('filename.zip')
.then((result) => {
  console.log('result');
  console.log(result);
})
.catch((error) => {
  console.log(error);
});

Upvotes: 2

Related Questions