path e url
node:path constrói caminhos de sistema de arquivos; node:url analisa e resolve URLs HTTP e file:// - confundi-los causa importações quebradas, redirecionamentos ruins e bugs SSRF.
Busque em todas as páginas da documentação
node:path constrói caminhos de sistema de arquivos; node:url analisa e resolve URLs HTTP e file:// - confundi-los causa importações quebradas, redirecionamentos ruins e bugs SSRF.
import path from 'node:path';
import { fileURLToPath } from 'node:url';
const dir = path.dirname(fileURLToPath(import.meta.url));
const config = path.join(dir, 'config.json');import { URL } from 'node:url';
const u = new URL('https://api.example.com/v1/users?page=2');
u.searchParams.set('limit', '50');Quando usar:
dist/import.meta.url para caminho absoluto do sistema de arquivosimport path from 'node:path';
import { fileURLToPath, URL } from 'node:url';
// Equivalente a __dirname em ESM
const root = path.dirname(fileURLToPath(import.meta.url));
const dataFile = path.resolve(root, '..', 'data', 'users.json');
// URL da API com construção segura de consulta
function usersEndpoint(base: string, page: number): string {
const url = new URL('/v1/users', base);
url.searchParams.set('page', String(page));
return url.href;
}
// Proteção SSRF - permita apenas https para host conhecido
function assertAllowedTarget(href: string, allowedHosts: Set<string>): URL {
const parsed = new URL(href);
if (parsed.protocol !== 'https:') throw new Error('https required');
if (!allowedHosts.has(parsed.hostname)) throw new Error('host not allowed');
return parsed;
}O que isso demonstra:
path.resolve e join evitam bugs de barra manualURL resolve caminhos relativos contra a URL basesearchParams codifica strings de consulta corretamenteprotocol e hostname antes de fetchwin32 vs posix) - path.join escolhe os separadores.URL do navegador.| Tarefa | Módulo |
|---|---|
| Juntar diretório de configuração | path.join |
| Analisar string de consulta em URL HTTP | URL |
| Chave de objeto S3 | path.posix.join |
| Normalizar URL de redirecionamento | new URL(input, base) |
import path from 'node:path';
export function safeJoin(base: string, userSegment: string): string {
const resolved = path.resolve(base, userSegment);
if (!resolved.startsWith(path.resolve(base))) {
throw new Error('path traversal');
}
return resolved;
}URL para HTTP, path para disco.path.join(base, userInput) - ../etc/passwd. Correção: resolver e verificar o prefixo sob a base.url.pathname é um caminho de sistema de arquivos no Windows - barra inicial semelhante a POSIX. Correção: fileURLToPath apenas para URLs file:.new URL(relative, base).new URL lida com host entre colchetes http://[::1]:8080.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
URL.canParse | Verificação rápida de validade | Precisa juntar sistema de arquivos |
path-to-regexp | Padrões de rota Express | Análise geral de URL |
| Strings de modelo brutas | Nunca para entrada do usuário | - |
| URL WHATWG em fetch | Saída do cliente | Caminhos de arquivo locais |
path.dirname(fileURLToPath(import.meta.url)).
resolve absolutiza da direita; join apenas concatena - use resolve para caminhos relativos ao usuário com proteção.
new URL('http://x?' + qs) ou url.searchParams - não divisão manual para valores codificados.
fileURLToPath converte para C:\... corretamente com a forma de três barras.
Valide a lista de permissões de hostname antes do fetch do lado do servidor - veja Proteções SSRF.
Sim para chaves S3 e rotas semelhantes a URL armazenadas como caminhos posix.
Jest/Vitest definem meta de importação - os caminhos ainda resolvem em relação ao módulo de teste.
searchParams.set codifica uma vez - não pré-codifique os valores.
Depreciado - use o construtor URL WHATWG.
new URL('/api', 'https://x.com/v1/') - o caminho base importa - teste cuidadosamente.
O framework lida com parâmetros de caminho - use URL apenas para chamadas de saída.
Os caminhos do contêiner são Linux - use posix dentro do contêiner, independentemente do SO de desenvolvimento.
Versões do Stack: Esta página foi escrita para Node.js 24.18.0 (Active LTS), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 e NestJS 11.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026