Returning CSV Content From an API in Node.js
Tags: data, javascript, programming, softwaredevelopment
Published: 2024-01-19 21:27:44

Several systems and platforms allow you to import data from a CSV ([Comma-Separated Values](https://en.wikipedia.org/wiki/Comma-separated_values)) file. This is because CSV is one of the most popular human-readable formats, especially regarding data science.

What generally happens is that you convert the data returned by an API or a query into a valid CSV file. This involves boilerplate code or manual work. Luckily, you can avoid all this.

This is because you can directly use Node.js to produce CSV as output, allowing users to download a CSV file. This is an automated and more practical solution.

Let's now learn how to build an API that returns CSV content in Node.js.

## Prerequisites

You do not need any extra library to return CSV content to an Express server. At the same time, you could adopt the `csv-generate` npm library for making CSV generation easier.

You can install `csv-generate` with the following command:

```shell
npm instal csv-generate
```

This is not required; here, you will see how to produce and return CSV content in Node.js without additional dependencies.

## Building an API That Returns a CSV File in Node.js

The [`Content-Type`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type) HTTP header is used to specify the [media type](https://developer.mozilla.org/en-US/docs/Glossary/MIME_type) of the returned content. As described [here](https://tools.ietf.org/html/rfc7111), the recommended media type for an HTTP request that returns CSV is `text/csv`.

Also, you can use the `Content-Disposition` HTTP header to specify that the content returned by the API is an attachment that should be downloaded and saved locally.

You can set these two HTTP headers in Node.js as follows:

```javascript
 res
    .set({
      "Content-Type": "text/csv",
      "Content-Disposition": `attachment; filename="<YOUR_FILE_NAME>.csv"`,
    })
```

Replace `<YOUR_FILE_NAME>` with the name you want to give to the CSV file returned by the API.

Keep also in mind that CSV files are often very different. You may need to produce files with different delimiters, enclosing quotes, escaping characters, line separators, encodings, etc. Note that `csv-generate` allows you to customize the output format for your CSV file.

Now, let's see what an API that returns CSV content in Node.js looks like:

```javascript
const express = require("express")
const app = express()

app.get("/users/getCSV", function (req, res) {
  // retrieving the user with a query...

  const users = [
    { name: "Patricia", surname: "Smith", age: null },
    { name: "John", surname: null, age: 56 },
    { name: "Maria", surname: "Brown", age: 37 },
  ]

  // initializing the CSV string content with the headers
  let csvData = ["name", "surname", "age"].join(",") + "\r\n"

  users.forEach((user) => {
    // populating the CSV content
    // and converting the null fields to ""
    csvData += [user.name, user.surname, user.age].join(",") + "\r\n"
  })

  // returning the CSV content via the "users.csv" file
  res
    .set({
      "Content-Type": "text/csv",
      "Content-Disposition": `attachment; filename="users.csv"`,
    })
    .send(csvData)
})
```

For simplicity, the data used to generate the CSV content was hard-coded. You can generate this data in a real-world scenario by performing a query or calling an API.

Then, the `csvData` string variable is initialized with the CSV headers. This is not mandatory and depends on what you want your output content to look like. Also, the CSV content generated here uses the "," delimiter, but any other valid delimiter will do.

Note that the [`join()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join) JavaScript function automatically converts `null` and `undefined` values into the `""` empty string. This is exactly how `null` or missing content is represented in the CSV format.

Now, call the `/users/getCSV` API, and you will get the following content:

```
name,surname,age  
Patricia,Smith,  
John,,56  
Maria,Brown,37
```

As you can see, the output generated by the API is valid CSV content. When called in the browser, the `users.csv` file will be automatically downloaded.

Et voilà! You just learned how to return CSV content in Node.js.

## Conclusion

Returning CSV content from an API is much more efficient than retrieving the desired data and then converting it into the desired output. You can return a CSV file directly with Node.js. In this article, you learned how to achieve such a result in an Express server.

Thanks for reading! I hope you found this article helpful.
  
***
_The post "[Returning CSV Content From an API in Node.js](https://writech.run/blog/returning-csv-content-from-an-api-in-node-js-3dafe19208e5/)" appeared first on [Writech](https://writech.run)._