Conceptos básicos de integraciones
8 ejemplos para empezar con las integraciones de terceros para APIs de Node.js: 6 básicos y 2 intermedios.
Busca en todas las páginas de la documentación
8 ejemplos para empezar con las integraciones de terceros para APIs de Node.js: 6 básicos y 2 intermedios.
npm install stripe got
npm install -D typescript@5.6 tsxConsulta Stripe, Twilio y patrones de SDK para obtener detalles específicos del proveedor.
// Mal: la ruta llama al SDK
app.post("/checkout", async (req, res) => {
const stripe = new Stripe(process.env.STRIPE_KEY!);
const pi = await stripe.paymentIntents.create({ amount: 1000, currency: "usd" });
res.json(pi);
});
// Bien: la ruta llama al servicio de integración
app.post("/checkout", async (req, res) => {
const result = await paymentsService.createIntent(req.body);
res.status(201).json(result);
});Relacionado: Casos de uso y servicios
// src/integrations/stripe-client.ts
import Stripe from "stripe";
let stripe: Stripe | null = null;
export function getStripe() {
if (!stripe) {
stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, {
apiVersion: "2024-11-20.acacia",
timeout: 10_000,
maxNetworkRetries: 0, // tu propia política de reintentos
});
}
return stripe;
}timeout explícito: los valores predeterminados del SDK pueden ser demasiado largos para el presupuesto de solicitudes HTTPexport async function withTimeout<T>(promise: Promise<T>, ms: number): Promise<T> {
const ac = new AbortController();
const timer = setTimeout(() => ac.abort(), ms);
try {
return await Promise.race([
promise,
new Promise<T>((_, reject) => {
ac.signal.addEventListener("abort", () => reject(new Error("timeout")));
}),
]);
} finally {
clearTimeout(timer);
}
}export function mapStripeError(err: unknown): AppError {
if (err instanceof Stripe.errors.StripeCardError) {
return new AppError("card_declined", 402, { code: err.code });
}
if (err instanceof Stripe.errors.StripeAPIError) {
return new AppError("payment_provider_unavailable", 503);
}
return new AppError("internal", 500);
}logger.info({
msg: "stripe_request",
requestId: req.headers["x-request-id"],
operation: "paymentIntents.create",
idempotencyKey: key,
});const key = process.env.NODE_ENV === "production"
? process.env.STRIPE_LIVE_KEY!
: process.env.STRIPE_TEST_KEY!;import got from "got";
const client = got.extend({
prefixUrl: "https://api.partner.com/v1/",
timeout: { request: 8_000 },
headers: { Authorization: `Bearer ${process.env.PARTNER_TOKEN}` },
});
export async function fetchPartnerStatus(id: string) {
return client.get(`status/${id}`).json<PartnerStatus>();
}got están documentados en Reintento y Resiliencia SalienteSaliente: tu API -> API de Stripe (crear pago)
Entrante: Stripe -> tu webhook (pago exitoso)
SDK oficial cuando esté disponible (Stripe, Twilio, AWS). HTTP puro para pequeños socios REST con generación de clientes OpenAPI.
Pruebas de módulo de servicio con mock HTTP (nock, MSW) o modo de prueba del proveedor.
Sí, para dependencias fuertes en la ruta de solicitud; consulta Disyuntores.
Prefiere la cola asíncrona cuando el usuario no necesita un resultado síncrono (correo electrónico, generación de PDF).
Stripe Connect o mapa de claves API por inquilino; nunca una clave global para cuentas conectadas sin un diseño.
Envuelve en un servicio inyectable; mismas reglas de tiempo de espera y mapeo de errores.
Fija las versiones principales del SDK; lee el registro de cambios del proveedor antes de actualizar.
Redacta los encabezados de autorización en los serializadores de Pino.
Versiones de la pila: Esta página fue escrita para Node.js 24.18.0 (LTS activa), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 y NestJS 11.
Revisado por Chris St. John·Última actualización: 16 jul 2026