AWS, AWS S3, node-js

How to Read a File from AWS S3 Bucket Using Node JS – Definitive Guide

Photo of author

Published on

by Vikram Aruchamy

Amazon Web Services (AWS) Simple Storage Service (S3) is a widely used object storage service that allows storing and retrieving files of all types. If you are working with Node.js, you can easily read files from an AWS S3 bucket.

This tutorial teaches you how to read a file from AWS S3 Bucket Using Node JS using different methods.

Prerequisites

Before we dive into reading files from an AWS S3 bucket, make sure you have the following prerequisites in place:

  • AWS Account: You should have an AWS account with access to an S3 bucket where the files are stored.
  • Node.js Installed: Ensure that you have Node.js installed on your machine. You can download it from the official Node.js website.
  • AWS SDK: You need to install the AWS SDK for JavaScript. You can install it using npm or yarn with the following command:
npm install aws-sdk

Setting Up AWS Credentials

To access your S3 bucket programmatically, you need to provide AWS credentials.

There are several ways to configure AWS credentials, but the most common method is to set environment variables.

You can set the following environment variables in your project’s .env file or directly in your operating system’s environment variables:

AWS_ACCESS_KEY_ID: Your AWS access key ID
AWS_SECRET_ACCESS_KEY: Your AWS secret access key
AWS_REGION: The AWS region where your S3 bucket is located

Alternatively, you can configure the credentials using the aws configure command.

aws configure

Creating an S3 Client

To interact with your S3 bucket, you need to create an S3 client using the AWS SDK. Here’s how you can do it:

const AWS = require('aws-sdk');

const s3 = new AWS.S3();

Reading file from AWS S3 using callback

To read a file from AWS S3 using a callback, you can use the getObject() method on the AWS S3 client. The getObject() method takes a callback function as its second argument, which is called when the request is complete.

The callback function takes two arguments:

  • an error object
  • a response object.

If the request is successful, the error object will be null, and the response object will contain the file contents.

The following code shows how to read a file from AWS S3 using a callback:

const AWS = require('aws-sdk');

const s3 = new AWS.S3();

const params = {
  Bucket: 'YOUR_BUCKET_NAME',
  Key: 'YOUR_FILE_NAME'
};

s3.getObject(params, (err, data) => {
  if (err) {
    console.error(err);
    return;
  }

  // Do something with the file contents
  const fileContents = data.Body;
});

When to Use

Callback is a good option when you must perform multiple asynchronous operations in sequence.

For example, you might want to read a file from AWS S3, process the file contents, and then write the processed file to a database. You can use a callback to ensure that the next operation is not started until the previous operation has finished successfully.

Advantages

  • Callbacks are simple to understand and use.
  • Callbacks are flexible and can be used to implement a variety of asynchronous patterns.

Disadvantages

  • Callback code can be difficult to read and maintain, especially when you have multiple nested callbacks.
  • Callbacks can lead to “callback hell,” which is a situation where you have a deep chain of nested callbacks.

Reading file from AWS S3 using promises async/await

To read a file from AWS S3 using promises and async/await, you can use the getObject() method on the AWS S3 client. The getObject() method returns a promise, which is an object that represents the eventual completion (or failure) of an asynchronous operation.

To use promises and async/await, you first need to wrap the getObject() method in an async function. Then, you can use the await keyword to wait for the promise to resolve before proceeding with the rest of your code.

The following code shows how to read a file from AWS S3 using promises and async/await:

const AWS = require('aws-sdk');

const s3 = new AWS.S3({ apiVersion: '2006-03-01' });

const params = {
  Bucket: 'YOUR_BUCKET_NAME',
  Key: 'YOUR_FILE_NAME'
};

async function readFile() {
  const response = await s3.getObject(params).promise();
  const fileContents = await response.Body.transformToString();

  // Do something with the file contents
  return fileContents;
}

const fileContents = await readFile();

When to Use

Using promises and async/await is a good option when you want to write asynchronous code that is easy to read and maintain. Promises and async/await allow you to write asynchronous code in a linear, synchronous style.

Advantages

  • Promises and async/await are easy to understand and use.
  • Promises and async/await make code more readable and maintainable.
  • Promises and async/await can help to avoid callback hell.

Disadvantages

  • All browsers do not support promises and async/await.
  • Promises and async/await can be more difficult to debug than callback code.

Handling Errors

A number of errors can occur when reading a file from AWS S3 using Node.js. Some of the most common errors include:

  • NoSuchKeyError: This error occurs if the file is not in the bucket.
  • AccessDeniedError: This error occurs if the user does not have permission to read the file.
  • BucketNotFoundError: This error occurs if the bucket does not exist.
  • TimeoutError: This error occurs if the request takes too long to complete.
  • NetworkError: This error occurs if there is a problem with the network connection.

In addition to these general errors, there are also a number of other errors that can occur, depending on the specific AWS S3 operation that you are performing. For example, if you are using the getObject() method to download a large file, you may encounter an error if the file is too large or if there is not enough disk space available.

It is important to handle these errors appropriately in your code.

For example, if you encounter a NoSuchKeyError, you may want to log the error and return a message to the user. If you encounter an AccessDeniedError, you may want to prompt the user to authenticate with AWS.

You can use the err object that is passed to the callback function or the catch block to get more information about the error. The err object contains the following properties:

  • code: The error code.
  • message: The error message.
  • stack: The stack trace.

You can use this information to debug the error and determine how to handle it.

Here is an example of how to handle errors when reading a file from AWS S3 using Node.js:

const AWS = require('aws-sdk');

const s3 = new AWS.S3({ apiVersion: '2006-03-01' });

const params = {
  Bucket: 'YOUR_BUCKET_NAME',
  Key: 'YOUR_FILE_NAME'
};

s3.getObject(params, (err, data) => {
  if (err) {
    console.error(err);

    // Handle the error here
    switch (err.code) {
      case 'NoSuchKeyError':
        // The file does not exist in the bucket.
        break;
      case 'AccessDeniedError':
        // The user does not have permission to read the file.
        break;
      default:
        // Handle other errors here
    }

    return;
  }

  // Do something with the file contents
  const fileContents = data.Body;
});

By handling errors appropriately, you can ensure that your Node.js application is reliable and robust.

Conclusion

Both callbacks and promises and async/await are valid ways to read files from AWS S3 using Node.js. The best method to use depends on your specific needs and preferences.

If you need to perform multiple asynchronous operations in sequence, then using callbacks is a good option. However, if you want to write asynchronous code that is easy to read and maintain, then using promises and async/await is a good option.

Leave a Comment