Todos los productos
Search
Centro de documentos

Alibaba Cloud SDK:Integrar el SDK

Última actualización: Sep 05, 2026

Cuando llama a una operación de OpenAPI, se recomienda integrar el SDK en su proyecto. Usar un SDK simplifica el proceso de desarrollo, permite integrar funciones rápidamente y reduce los costos de mantenimiento. La integración de un SDK de Alibaba Cloud consta de tres pasos principales: importar el SDK de Alibaba Cloud, establecer las credenciales de acceso y usar el SDK. Este tema describe el proceso de integración del SDK en detalle.

Requisitos del entorno

Node.js >= 8.x

Importar el SDK

  1. Inicie sesión en SDK Center y seleccione el producto de la API que desea llamar, como Short Message Service (SMS).

  2. En la página Installation y configure All Languages en TypeScript. A continuación, en la pestaña Quick Start, encontrará las instrucciones de instalación del SDK para Short Message Service (SMS).image

Establecer las credenciales de acceso

Para llamar a operaciones de OpenAPI se requieren credenciales de acceso, como AccessKey o un token de Security Token Service (STS) token. Almacene las credenciales en variables de entorno para evitar filtraciones. Para conocer las prácticas recomendadas, consulte Securely use access credentials. Los ejemplos a continuación usan las variables de entorno ALIBABA_CLOUD_ACCESS_KEY_ID y ALIBABA_CLOUD_ACCESS_KEY_SECRET.

Método de configuración en Linux y macOS

Los siguientes ejemplos usan ALIBABA_CLOUD_ACCESS_KEY_ID y ALIBABA_CLOUD_ACCESS_KEY_SECRET como nombres de variable. Si lo necesita, reemplácelos por sus propios nombres, como OSS_ACCESS_KEY_ID y OSS_ACCESS_KEY_SECRET.

Ejecute los siguientes comandos export para establecer las variables de entorno:

Importante

Las variables que se establecen con export son temporales y solo son válidas para la sesión actual. Para que sean persistentes, agregue el comando export a su archivo de inicio de shell (como ~/.bashrc o ~/.zshrc).

  • Establezca el AccessKey ID:

    # Replace yourAccessKeyID with your AccessKey ID.
    export ALIBABA_CLOUD_ACCESS_KEY_ID=yourAccessKeyID
  • Establezca el AccessKey secret:

    # Replace yourAccessKeySecret with your AccessKey secret.
    export ALIBABA_CLOUD_ACCESS_KEY_SECRET=yourAccessKeySecret
  • Compruebe la configuración.

    Ejecute echo $ALIBABA_CLOUD_ACCESS_KEY_ID. Si se devuelve el valor correcto, la configuración fue exitosa.

Método de configuración en Windows

Usar la interfaz gráfica de usuario (GUI)

  • Procedimiento

    A continuación se describe cómo establecer variables de entorno mediante la GUI en Windows 10.

    En el escritorio, haga clic derecho en This PC y elija Properties > Advanced system settings > Environment Variables > New en System variables o User variables. Luego, complete la configuración.

    Variable

    Valor de ejemplo

    AccessKey ID

    • Nombre de la variable: ALIBABA_CLOUD_ACCESS_KEY_ID

    • Valor de la variable: yourAccessKeyID

    AccessKey secret

    • Nombre de la variable: ALIBABA_CLOUD_ACCESS_KEY_SECRET

    • Valor de la variable: yourAccessKeySecret

  • Pruebe la configuración

    Haga clic en Start (o use el atajo de teclado Win+R), haga clic en Run, introduzca cmd y luego haga clic en OK (o presione Enter) para abrir el símbolo del sistema. Ejecute los comandos echo %ALIBABA_CLOUD_ACCESS_KEY_ID% y echo %ALIBABA_CLOUD_ACCESS_KEY_SECRET%. Si los comandos devuelven el AccessKey correcto, la configuración fue exitosa.

Usar el símbolo del sistema (CMD)

  • Procedimiento

    Abra el símbolo del sistema como administrador y ejecute los siguientes comandos para agregar nuevas variables de entorno al sistema.

    setx ALIBABA_CLOUD_ACCESS_KEY_ID yourAccessKeyID /M
    setx ALIBABA_CLOUD_ACCESS_KEY_SECRET yourAccessKeySecret /M

    El parámetro /M indica una variable de entorno del sistema. Puede omitir este parámetro cuando establezca una variable de entorno de usuario.

  • Pruebe la configuración

    Haga clic en Start (o use el atajo de teclado Win+R), haga clic en Run, introduzca cmd y luego haga clic en OK (o presione Enter) para abrir el símbolo del sistema. Ejecute los comandos echo %ALIBABA_CLOUD_ACCESS_KEY_ID% y echo %ALIBABA_CLOUD_ACCESS_KEY_SECRET%. Si los comandos devuelven el AccessKey correcto, la configuración fue exitosa.

Usar Windows PowerShell

En PowerShell, puede establecer nuevas variables de entorno que son válidas para todas las sesiones nuevas:

[System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_ID', 'yourAccessKeyID', [System.EnvironmentVariableTarget]::User)
[System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_SECRET', 'yourAccessKeySecret', [System.EnvironmentVariableTarget]::User)

Para establecer variables de entorno para todos los usuarios, debe tener permisos de administrador:

[System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_ID', 'yourAccessKeyID', [System.EnvironmentVariableTarget]::Machine)
[System.Environment]::SetEnvironmentVariable('ALIBABA_CLOUD_ACCESS_KEY_SECRET', 'yourAccessKeySecret', [System.EnvironmentVariableTarget]::Machine)

También puede establecer variables de entorno temporales que solo son válidas para la sesión actual:

$env:ALIBABA_CLOUD_ACCESS_KEY_ID = "yourAccessKeyID"
$env:ALIBABA_CLOUD_ACCESS_KEY_SECRET = "yourAccessKeySecret"

En PowerShell, ejecute los comandos Get-ChildItem env:ALIBABA_CLOUD_ACCESS_KEY_ID y Get-ChildItem env:ALIBABA_CLOUD_ACCESS_KEY_SECRET. Si los comandos devuelven el AccessKey correcto, la configuración fue exitosa.

Usar el SDK

Este tema proporciona un ejemplo sobre cómo llamar a la operación de API o SendMessageToGlobe de Short Message Service (SMS). Para consultar la referencia de la API de la operación o SendMessageToGlobe, consulte o SendMessageToGlobe.

1. Inicializar el cliente de solicitud

Todas las llamadas a OpenAPI pasan por un cliente de solicitud. Este ejemplo inicializa un cliente con un par de AccessKey. Para conocer otros métodos de inicialización, consulte Manage access credentials.

Importante
  • Los objetos de cliente, como las instancias de Dysmsapi20180501 y , son seguros para hilos. Por lo tanto, se pueden usar en un entorno multihilo sin necesidad de crear una instancia independiente para cada hilo.

  • Evite crear objetos de cliente repetidamente con new. Use el patrón singleton para que solo exista una instancia de cliente por credencial y endpoint durante todo el ciclo de vida de la aplicación.

Ejemplo de TypeScript

import Dysmsapi20180501, * as $Dysmsapi20180501 from '@alicloud/dysmsapi20180501';
import OpenApi, * as $OpenApi from '@alicloud/openapi-client';
import Util, * as $Util from '@alicloud/tea-util';

export default class Client {

  static createClient(): Dysmsapi20180501 {
    let config = new $OpenApi.Config({
      // Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is set.
      accessKeyId: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'],
      // Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is set.
      accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
    });
    // For more information about the endpoint, see https://api.alibabacloud.com/product/Dysmsapi.
    config.endpoint = `dysmsapi.aliyuncs.com`;
    return new Dysmsapi20180501(config);
  }
}

Ejemplo de Node.js

const Dysmsapi20180501 = require('@alicloud/dysmsapi20180501');
const OpenApi = require('@alicloud/openapi-client');
const Util = require('@alicloud/tea-util');
const Tea = require('@alicloud/tea-typescript');

class Client {

  static createClient() {
    let config = new OpenApi.Config({
      // Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is set.
      accessKeyId: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'],
      // Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is set.
      accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
    });
    // For more information about the endpoint, see https://api.alibabacloud.com/product/Dysmsapi.
    config.endpoint = `dysmsapi.aliyuncs.com`;
    return new Dysmsapi20180501.default(config);
  }
}

2. Crear el objeto de solicitud

Pase los parámetros mediante el objeto de solicitud del SDK, denominado <OpenAPI Name>Request (por ejemplo, SendSmsRequest). Para conocer los detalles de los parámetros, consulte la referencia de la API: SendMessageToGlobe.

Nota

Si una API no tiene parámetros de solicitud, omita este paso. Por ejemplo, DescribeCdnSubList no requiere un objeto de solicitud.

Ejemplo de TypeScript

 // Create request object and set required input parameters
 let sendMessageToGlobeRequest = new $Dysmsapi20180501.SendMessageToGlobeRequest({
      // Please replace with the actual recipient number.
      to: "<YOUR_VALUE>",
      // Please replace with the actual SMS content.
      message: "<YOUR_VALUE>",
    });

Ejemplo de Node.js

// Create request object and set required input parameters
let sendMessageToGlobeRequest = new Dysmsapi20180501.SendMessageToGlobeRequest({
    // Please replace with the actual recipient number.
    to: '<YOUR_VALUE>',
    // Please replace with the actual SMS content.
    message: '<YOUR_VALUE>',
});

3. Enviar la solicitud

Llame a la función <operationName>WithOptions del cliente, donde <operationName> es el nombre de la API en formato camel case. Esta función recibe un objeto de solicitud y parámetros de tiempo de ejecución (timeout, proxy, etc.). Consulte Advanced configurations.

Nota

Si una API no tiene parámetros de solicitud, pase únicamente las opciones de tiempo de ejecución. Por ejemplo, DescribeCdnSubList solo requiere parámetros de tiempo de ejecución.

Ejemplo de TypeScript

// Create runtime parameters.
let runtime = new $Util.RuntimeOptions({ });
let client = Client.createClient();
// Send a request.
await client.sendMessageToGlobeWithOptions(sendMessageToGlobeRequest, runtime);

Ejemplo de Node.js

// Create runtime parameters.
let runtime = new Util.RuntimeOptions({ });
let client = Client.createClient();
// Send a request.
await client.sendMessageToGlobeWithOptions(sendMessageToGlobeRequest, runtime);

4. Controlar excepciones

El SDK V2.0 de Node.js genera dos tipos de excepciones:

  • UnretryableError: se genera después de agotar el número máximo de reintentos, generalmente debido a problemas de red. Recupere la última solicitud mediante err.data.lastRequest.

  • ResponseError: indica un error del lado del servidor que devuelve la API.

Consulte Exception handling.

Importante

Siempre controle las excepciones: propáguelas, regístrelas o recupérese de ellas. Nunca las ignore de forma silenciosa.

Haga clic para ver el ejemplo de código completo

Ejemplo de llamada a la API SendMessageToGlobe

Ejemplo de TypeScript

import Dysmsapi20180501, * as $Dysmsapi20180501 from '@alicloud/dysmsapi20180501';
import OpenApi, * as $OpenApi from '@alicloud/openapi-client';
import Util, * as $Util from '@alicloud/tea-util';

export default class Client {

  static createClient(): Dysmsapi20180501 {
    let config = new $OpenApi.Config({
      // Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is set.
      accessKeyId: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'],
      // Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is set.
      accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
    });
    // For more information about the endpoint, see https://api.alibabacloud.com/product/Dysmsapi.
    config.endpoint = `dysmsapi.aliyuncs.com`;
    return new Dysmsapi20180501(config);
  }

  static async main(): Promise<void> {
    let client = Client.createClient();
    // Create a request object and set the input parameters.
    let sendMessageToGlobeRequest = new $Dysmsapi20180501.SendMessageToGlobeRequest({
      to: "<YOUR_VALUE>",
      from: "<YOUR_VALUE>",
      message: "<YOUR_VALUE>",
    });
    let runtime = new $Util.RuntimeOptions({ });
    try {
      // Send the request.
      await client.sendMessageToGlobeWithOptions(sendMessageToGlobeRequest, runtime);
    } catch (error) {
      // This is for demonstration purposes only. Handle exceptions with care. Do not ignore exceptions in your project.
      // Error message
      console.log(error.message);
      // Diagnostic address
      console.log(error.data["Recommend"]);
    }    
  }
}

Client.main();

Ejemplo de Node.js

const Dysmsapi20180501 = require('@alicloud/dysmsapi20180501');
const OpenApi = require('@alicloud/openapi-client');
const Util = require('@alicloud/tea-util');

class Client {

  static createClient() {
    let config = new OpenApi.Config({
      // Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is set.
      accessKeyId: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'],
      // Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is set.
      accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
    });
    // For more information about the endpoint, see https://api.alibabacloud.com/product/Dysmsapi.
    config.endpoint = `dysmsapi.aliyuncs.com`;
    return new Dysmsapi20180501.default(config);
  }

  static async main() {
    // Create a request object and set the input parameters.
    let client = Client.createClient();
    let sendMessageToGlobeRequest = new Dysmsapi20180501.SendMessageToGlobeRequest({
      to: '<YOUR_VALUE>',
      from: '<YOUR_VALUE>',
      message: '<YOUR_VALUE>',
    });
    let runtime = new Util.RuntimeOptions({ });
    try {
      // Send the request.
      await client.sendMessageToGlobeWithOptions(sendMessageToGlobeRequest, runtime);
    } catch (error) {
      // This is for demonstration purposes only. Handle exceptions with care. Do not ignore exceptions in your project.
      // Error message
      console.log(error.message);
      // Diagnostic address
      console.log(error.data["Recommend"]);
      Util.default.assertAsString(error.message);
    }    
  }
}

exports.Client = Client;
Client.main();

Carga de archivos con operaciones Advance

Algunas API (como las de búsqueda de imágenes y Visual Intelligence) no aceptan rutas de archivos locales directamente. Use la operación Advance para cargar archivos mediante un stream. El SDK almacena el archivo temporalmente en un bucket de OSS en la región cn-shanghai, y el servicio lo lee desde ahí. Este ejemplo usa la operación DetectBodyCount de Visual Intelligence API.

Importante

Los archivos temporales almacenados en Alibaba Cloud OSS se eliminan periódicamente.

  1. Inicialice el cliente de solicitud

    Establezca tanto regionId como endpoint en la misma región. El valor de regionId determina dónde se almacena el archivo temporal de OSS. Si omite regionId, la diferencia de región entre el producto y el bucket de OSS provocará tiempos de espera agotados.

    Ejemplo de TypeScript

    function createClient(): facebody20191230 {
        let config = new $OpenApi.Config({
            // Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is set.
            accessKeyId: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'],
            // Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is set.
            accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
        });
        // The endpoint and regionId must be for the same region.
        config.regionId = 'cn-shanghai';
        config.endpoint = 'facebody.cn-shanghai.aliyuncs.com';
        return new facebody20191230(config);
    }

    Ejemplo de Node.js

    function createClient() {
      let config = new OpenApi.Config({
        // Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is set.
        accessKeyId: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'],
        // Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is set.
        accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
      });
      // The endpoint and regionId must be for the same region.
      config.regionId = 'cn-shanghai';
      config.endpoint = 'facebody.cn-shanghai.aliyuncs.com';
      return new facebody20191230.default(config);
    }
  2. Cree el objeto de solicitud

    Cree un objeto <OpenAPIName>AdvanceRequest para pasar el stream del archivo. El nombre del parámetro para el stream del archivo es ImageURLObject.

    Ejemplo de TypeScript

        // Read the file as a file stream.
        const filePath = '<FILE_PATH>';  // Replace this with the actual file path.
        // Check if the file exists.
        if (!fs.existsSync(filePath)) {
            console.error('File does not exist:', filePath);
            return;
        }
        // Create a stream and listen for stream errors.
        const fileStream = fs.createReadStream(filePath).on('error', (err) => {
            console.error('Stream error:', err);
            process.exit(1);
        });
    
        let detectBodyCountAdvanceRequest = new $facebody20191230.DetectBodyCountAdvanceRequest({
          imageURLObject: fileStream,
        });

    Ejemplo de Node.js

        // Read the file as a file stream.
        const filePath = '<FILE_PATH>';  // Replace this with the actual file path.
        // Check if the file exists.
        if (!fs.existsSync(filePath)) {
            console.error('File does not exist:', filePath);
            return;
        }
        // Create a stream and listen for stream errors.
        const fileStream = fs.createReadStream(filePath).on('error', (err) => {
            console.error('Stream error:', err);
            process.exit(1);
        });
    
        let detectBodyCountAdvanceRequest = new facebody20191230.DetectBodyCountAdvanceRequest({
            imageURLObject: fileStream,
        });
  3. Envíe la solicitud

    Llame a la función <operationName>Advance para enviar la solicitud.

    Ejemplo de TypeScript

    // Configure runtime parameters.
    let runtime = new $Util.RuntimeOptions({ });
    let client = Client.createClient();
    // Send the request.
    await client.detectBodyCountAdvance(detectBodyCountAdvanceRequest, runtime);

    Ejemplo de Node.js

     // Configure runtime parameters.
     let runtime = new Util.RuntimeOptions({ });
     let client = Client.createClient();
     // Send the request.
     await client.detectBodyCountAdvance(detectBodyCountAdvanceRequest, runtime);  

Haga clic para ver el ejemplo de código completo

Ejemplo de TypeScript

import { default as facebody20191230 } from '@alicloud/facebody20191230';
import * as $facebody20191230 from '@alicloud/facebody20191230';
import * as $OpenApi from '@alicloud/openapi-client';
import * as $Util from '@alicloud/tea-util';
import * as fs from "fs";

export default class Client {
    static createClient(): facebody20191230 {
        let config = new $OpenApi.Config({
            // Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is set.
            accessKeyId: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'],
            // Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is set.
            accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
        });
        config.regionId = 'cn-shanghai';
        config.endpoint = 'facebody.cn-shanghai.aliyuncs.com';
        return new facebody20191230(config);
    }

    static async main(): Promise<void> {
        let client = Client.createClient();

        // Read the file as a file stream.
        const filePath = '<FILE_PATH>';  // Replace this with the actual file path.
        // Check if the file exists.
        if (!fs.existsSync(filePath)) {
            console.error('File does not exist:', filePath);
            return;
        }
        // Create a stream and listen for stream errors.
        const fileStream = fs.createReadStream(filePath).on('error', (err) => {
            console.error('Stream error:', err);
            process.exit(1);
        });

        let detectBodyCountAdvanceRequest = new $facebody20191230.DetectBodyCountAdvanceRequest({
            imageURLObject: fileStream,
        });
        let runtime = new $Util.RuntimeOptions({});
        try {
            // Send the request.
            const res = await client.detectBodyCountAdvance(detectBodyCountAdvanceRequest, runtime);
            console.log(res);
        } catch (error) {
            if (error instanceof Error) {
                console.error('Error message:', error.message);
                const data = (error as any)?.data?.Recommend;
                if (typeof data === 'string') {
                    console.log('Diagnostic suggestion:', data);
                }
            }
        }
    }
}

Client.main();

Ejemplo de Node.js

'use strict';
const facebody20191230 = require('@alicloud/facebody20191230');
const OpenApi = require('@alicloud/openapi-client');
const Util = require('@alicloud/tea-util');
const fs = require('fs');

class Client {
  static createClient() {
    let config = new OpenApi.Config({
      // Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is set.
      accessKeyId: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'],
      // Required. Make sure that the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is set.
      accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
    });
    config.regionId = 'cn-shanghai';
    config.endpoint = 'facebody.cn-shanghai.aliyuncs.com';
    return new facebody20191230.default(config);
  }

  static async main() {
    let client = Client.createClient();
    // Read the file as a file stream.
    const filePath = '<FILE_PATH>';  // Replace this with the actual file path.
    // Check if the file exists.
    if (!fs.existsSync(filePath)) {
      console.error('File does not exist:', filePath);
      return;
    }
    // Create a stream and listen for stream errors.
    const fileStream = fs.createReadStream(filePath).on('error', (err) => {
      console.error('Stream error:', err);
      process.exit(1);
    });
    // Configure request parameters.
    let detectBodyCountAdvanceRequest = new facebody20191230.DetectBodyCountAdvanceRequest({
      imageURLObject: fileStream,
    });
    let runtime = new Util.RuntimeOptions({});
    try {
      // Send the request.
      const res = await client.detectBodyCountAdvance(detectBodyCountAdvanceRequest, runtime);
      console.log(res);
    } catch (error) {
      // This is for demonstration purposes only. Handle exceptions with care. Do not ignore exceptions in your project.
      console.log(error);
    }
  }
}

exports.Client = Client;
Client.main();

Preguntas frecuentes

  1. Error "You are not authorized to perform this operation" al llamar a una API

    Causa y solución

    Causa: El usuario de RAM asociado a su AccessKey no tiene los permisos obligatorios para llamar a la API.

    Solución: Otorgue los permisos de API obligatorios al usuario de RAM. Consulte Manage RAM user permissions.

    Por ejemplo, si recibe este error al llamar a o SendMessageToGlobe, cree a continuación una política de permisos personalizada y vincúlela al usuario de RAM.

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "dysms:SendMessageToGlobe",
          "Resource": "*"
        }
      ]
    }
  2. Error "triggerUncaughtException Error: getaddrinfo ENOTFOUND" (problema de endpoint)

    Causa y solución

    Causa: La operación de OpenAPI que está llamando no es compatible con el endpoint especificado.

    Solución: Corrija el endpoint con Endpoint configuration e inténtelo de nuevo.

  3. Error "Cannot read properties of undefined (reading 'getCredential')" o "InvalidAccessKeyId.NotFound: code: 404"

    Causa y solución

    Causa: El AccessKey no se pasó correctamente.

    Solución: Compruebe que el AccessKey se pase de forma correcta durante la inicialización del cliente. process.env("XXX") lee el valor de XXX desde las variables de entorno.

Para otros errores comunes, consulte FAQ.