Driblando separadores específicos dos SO's com Node.js
Tags: path, node, linux, windows
Published: 2020-02-24 06:43:04

---
title: Driblando separadores específicos dos SO's com Node.js
published: true
description: Utilizando path.resolve() para navegação no sistema de arquivos de qualquer sistema operacional.
tags: path,nodejs,linux,windows
cover_image: https://images.unsplash.com/photo-1461360228754-6e81c478b882?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=753&q=80
---

## Situação

Outro dia, no serviço, me encontrei em uma situação em que determinado projeto, desenvolvido em Node.js, estava sendo executado normalmente em minha máquina porém na máquina de outros colegas de trabalho não.

## Problema
O problema relatado durante a execução do projeto era de que certos arquivos não estavam sendo encontrados em algumas configurações de importação.


## Descoberta

Sugerimos então que o problema poderia se dar ao fato de estarmos utilizando diferentes sistemas operacionais. Enquanto que eu utilizava o Ubuntu 18.04, alguns outros colegas da equipe estavam utilizando Windows 10.

## Resolução

Como dito anteriormente, o projeto havia sido desenvolvido em Node.js. E para a nossa alegria ele oferece um módulo para trabalharmos com arquivos e diretórios dentro de um sistema de arquivos: o módulo [path](https://nodejs.org/api/path.html#path_path).

O nosso projeto estava utilizando o método `path.join()` para "montar" os caminhos para as quais os nossos arquivos de importação estavam localizados. Porém, de acordo com a documentação do [path.join()](https://nodejs.org/api/path.html#path_path_join_paths):

> The path.join() method joins all given path segments together using the platform-specific separator as a delimiter, then normalizes the resulting path.

Ou seja, ele utiliza o separador de diretórios do próprio sistema operacional. No caso, o Windows utiliza um separador diferente do Linux. Enquanto que o separador de diretórios no Windows é a `\\` (barras invertidas, *backslashes*), o Linux utiliza a `/` (barra oblíqua).

Como solução, aproveitamos para utilizar um outro método que a API path nos fornece: o [path.resolve()](https://nodejs.org/api/path.html#path_path_resolve_paths).

Diferentemente do join(), o resolve() não faz o uso do separador específico do sistema operacional. Dessa forma, quando a normalização dos caminhos for realizada pelo Node.js, o mesmo caminho será percorrido tanto no Windows quanto no Linux ou macOS.

## Utilizando path.join() e path.resolve()

A utilização de ambos os métodos é parecida:

Para o join():
```javascript
path.join([params...])
```

Para o resolve():
```javascript
path.resolve([params...])
```

Você passa para os métodos um *array* que "simulariam" o caminho para se chegar até determinado diretório/arquivo. 
Exemplo:

Considerando que estamos no seguinte diretório `/home/leo/app` e queiramos navegar para dois diretórios anteriores (`/home`):

```javascript
const path = require('path');

path.join(['..', '..')];
```

ou

```javascript
const path = require('path');

path.resolve(['..', '..')];
```

Ou, suponhamos que em `/home/leo/app` exista um diretório **assets** que possua outros diretórios dentro dele:

```javascript
const path = require('path');

const profileImagePath = path.join(['assets', 'images', 'profile.png']);
```
ou

```javascript
const path = require('path');

const profileImagePath = path.resolve(['assets', 'images', 'profile.png']);
```

***

Você já se deparou com algum desafio envolvendo diferentes sistemas operacionais? Como resolveu?