Compatibilidade APIs Node.js - Path

O módulo path no Node.js fornece utilitários para trabalhar com caminhos de arquivos e diretórios. Ele oferece um conjunto de funções que ajudam desenvolvedores a manipular e normalizar caminhos, facilitando o tratamento de operações de sistema de arquivos entre diferentes sistemas operacionais. Este módulo está disponível no Azion Runtime através da compatibilidade com Node.js, sendo comumente usado em functions para construir ou normalizar caminhos, por exemplo ao rotear requisições ou compor referências de assets.


Exemplo: Operações básicas com path

O exemplo abaixo mostra como usar o módulo path em uma function:

/**
* An example of using the Node.js Path API in an Azion Function.
* Support:
* - Partially supported (Extended by library `path-browserify`)
* @module runtime-apis/nodejs/path/main
* @example
* // Execute with Azion Bundler:
* npx edge-functions build
* npx edge-functions dev
*/
import path from "node:path";
/**
* An example of using the Node.js Path API in an Azion Function.
* @param {*} event
* @returns {Promise<Response>}
*/
const main = async (event) => {
const pathName = path.join("/", "images", "image.jpg");
console.log("Path", pathName);
return new Response(`Path: ${pathName}`);
};
export default main;

Exemplo: Roteamento de URL com path

Use métodos de path para analisar e construir caminhos de URL para roteamento:

import path from "node:path";
const main = async (event) => {
const requestUrl = new URL(event.request.url);
const pathname = requestUrl.pathname;
// Extract path components
const dirname = path.dirname(pathname);
const basename = path.basename(pathname);
const extname = path.extname(pathname);
console.log("Directory:", dirname);
console.log("Filename:", basename);
console.log("Extension:", extname);
// Build a new path for routing
const apiPath = path.join("/api", "v1", "users", basename);
console.log("API path:", apiPath);
// Note: path.resolve() works for path string manipulation in edge runtimes,
// but doesn't interact with an actual filesystem
const absolutePath = path.resolve("/app", "public", "images", "logo.png");
console.log("Absolute path:", absolutePath);
return new Response(JSON.stringify({
original: pathname,
dirname,
basename,
extname,
apiPath,
absolutePath
}), {
headers: { "Content-Type": "application/json" }
});
};
export default main;

Exemplo: Normalização e análise de caminhos

Normalize caminhos e extraia informações detalhadas:

import path from "node:path";
const main = async (event) => {
// Normalize messy paths
const messyPath = "/users/../public/./images//photo.jpg";
const normalizedPath = path.normalize(messyPath);
console.log("Normalized:", normalizedPath);
// /public/images/photo.jpg
// Parse path into components (using edge-runtime-neutral paths)
const filePath = "/assets/css/styles.css";
const parsed = path.parse(filePath);
console.log("Parsed:", parsed);
// { root: '/', dir: '/assets/css', base: 'styles.css', ext: '.css', name: 'styles' }
// Format path from object
const formatted = path.format({
root: "/",
dir: "/data/documents",
base: "report.pdf"
});
console.log("Formatted:", formatted);
// Check if path is absolute
const isAbs1 = path.isAbsolute("/assets/app.js");
const isAbs2 = path.isAbsolute("../relative/path");
console.log("Is absolute:", isAbs1, isAbs2);
return new Response(JSON.stringify({
normalizedPath,
parsed,
formatted,
isAbsolute: { absolute: isAbs1, relative: isAbs2 }
}), {
headers: { "Content-Type": "application/json" }
});
};
export default main;

Exemplo: Construção de caminhos para assets estáticos

Construa caminhos para assets estáticos e entrega de conteúdo:

import path from "node:path";
const main = async (event) => {
const request = event.request;
const url = new URL(request.url);
// Base directory for static files
const staticBase = "/static";
// Get requested file path
const requestedPath = url.pathname.replace(/^\/static/, "");
// Build full path
const fullPath = path.join(staticBase, requestedPath);
console.log("Full path:", fullPath);
// Security: Validate that the resolved path stays within staticBase
// This prevents path traversal attacks (e.g., /static/../sensitive/file)
const resolvedPath = path.resolve(staticBase, requestedPath);
if (!resolvedPath.startsWith(staticBase)) {
return new Response("Forbidden", { status: 403 });
}
// Determine content type based on extension
const ext = path.extname(fullPath).toLowerCase();
const contentTypes = {
".html": "text/html",
".css": "text/css",
".js": "application/javascript",
".json": "application/json",
".png": "image/png",
".jpg": "image/jpeg",
".svg": "image/svg+xml"
};
const contentType = contentTypes[ext] || "application/octet-stream";
console.log("Content-Type:", contentType);
// Build relative path from current location
const relativePath = path.relative("/static/images", fullPath);
console.log("Relative path:", relativePath);
return new Response(JSON.stringify({
fullPath,
resolvedPath,
extension: ext,
contentType,
relativePath
}), {
headers: { "Content-Type": "application/json" }
});
};
export default main;

Exemplo: Tratamento de caminhos multiplataforma

Manipule caminhos de forma consistente entre diferentes ambientes:

import path from "node:path";
const main = async (event) => {
// Default path methods (platform-specific)
const defaultJoin = path.join("folder", "subfolder", "file.txt");
const defaultSep = path.sep;
// Force POSIX-style paths (forward slashes)
// Note: path.posix and path.win32 are properties of the main module
const posixJoin = path.posix.join("folder", "subfolder", "file.txt");
const posixSep = path.posix.sep;
// Force Windows-style paths (backslashes)
const win32Join = path.win32.join("folder", "subfolder", "file.txt");
const win32Sep = path.win32.sep;
console.log("Default join:", defaultJoin);
console.log("POSIX join:", posixJoin);
console.log("Windows join:", win32Join);
// Get delimiter for PATH environment variable
const delimiter = path.delimiter;
console.log("Path delimiter:", delimiter);
return new Response(JSON.stringify({
default: { join: defaultJoin, sep: defaultSep },
posix: { join: posixJoin, sep: posixSep },
win32: { join: win32Join, sep: win32Sep },
delimiter
}), {
headers: { "Content-Type": "application/json" }
});
};
export default main;

APIs com suporte

APIStatus
path.basename()🟢 Com suporte
path.dirname()🟢 Com suporte
path.extname()🟢 Com suporte
path.format()🟢 Com suporte
path.isAbsolute()🟢 Com suporte
path.join()🟢 Com suporte
path.normalize()🟢 Com suporte
path.parse()🟢 Com suporte
path.relative()🟢 Com suporte
path.resolve()🟢 Com suporte
path.sep🟢 Com suporte
path.delimiter🟢 Com suporte
path.posix🟢 Com suporte
path.win32🟢 Com suporte

Recursos relacionados