Function Compute captura los errores que genera su función de Node.js y devuelve una respuesta estructurada. En esta página se describen las dos categorías de errores que pueden producir las funciones de Node.js y cómo interpretar los códigos de estado HTTP del servicio.
Tipos de errores
Excepciones capturadas
Cuando su función lanza una excepción, Function Compute la captura y devuelve un objeto JSON con tres campos:
|
Campo |
Descripción |
|
|
La cadena con el mensaje de error |
|
|
El nombre de la clase de error de JavaScript |
|
|
Un arreglo de marcos de pila |
Módulos ECMAScript
La sintaxis de módulos ECMAScript requiere Node.js 18 o posterior. El código de ejemplo es compatible con el despliegue con un solo clic ( nodejs-fc-err-es ).
export const handler = async (event, context) => {
throw new Error('oops');
};
Módulos CommonJS
exports.handler = function(event, context, callback) {
throw new Error('oops');
};
Respuesta de ejemplo:
{
"errorMessage": "oops",
"errorType": "Error",
"stackTrace": [
"Error: oops",
" at handler (file:///code/index.mjs:2:9)",
" at module.exports (file:///var/fc/runtime/nodejs20/bootstrap.mjs:5655:14)",
" at process.processTicksAndRejections (node:internal/process/task_queues:95:5)"
]
}
Salidas anómalas
Si su función llama a process.exit() durante su ejecución, el entorno no puede capturar un error estructurado. En su lugar, el servicio devuelve un mensaje genérico:
Módulos ECMAScript
La sintaxis de módulos ECMAScript requiere Node.js 18 o posterior.
export const handler = async (event, context) => {
process.exit(1);
};
Módulos CommonJS
exports.handler = function(event, context, callback) {
process.exit(1);
};
Respuesta de ejemplo:
{
"errorMessage": "Process exited unexpectedly before completing request (duration: 12ms, maxMemoryUsage: 0MB)"
}
Códigos de estado HTTP
Una respuesta 2xx no garantiza que la función se haya ejecutado correctamente. Compruebe el encabezado de respuesta X-Fc-Error-Type para detectar los errores de función devueltos con un código de estado 2xx.
Cuando falla la invocación de una función, Function Compute devuelve un código de estado HTTP, un cuerpo de respuesta y, en caso de errores a nivel de función, un encabezado de respuesta X-Fc-Error-Type. Revise estos indicadores para manejar los errores en el código o mostrarlos a los usuarios finales.
|
Código de estado |
Significado |
|
2xx |
Function Compute recibió la solicitud. Si la respuesta incluye el encabezado |
|
4xx (excepto 429) |
El cliente que inició la invocación envió una solicitud no válida. |
|
429 |
Se limitó la tasa de la solicitud. |
|
5xx |
Ocurrió un error interno en Function Compute, la configuración de la función no es válida o existe un problema de recursos. |
Para obtener más información sobre los errores de invocación, consulte Configure a retry mechanism.
Preguntas frecuentes
require is not defined in ES module scope
Síntoma
Cuando el archivo de entrada de una función de Node.js se carga como módulo ES (la extensión del archivo es .mjs o package.json define "type": "module") y el código usa require() para cargar módulos, la invocación devuelve el código de estado HTTP 200. Además, los encabezados de respuesta incluyen X-Fc-Error-Type: InvocationError y el cuerpo de respuesta contiene el siguiente error:
{
"errorMessage": "require is not defined in ES module scope, you can use import instead",
"errorType": "ReferenceError",
"stackTrace": [
"ReferenceError: require is not defined in ES module scope, you can use import instead",
" at file:///code/index.mjs:1:15",
" at ModuleJob.run (node:internal/modules/esm/module_job:218:25)"
]
}
El contenido del error varía según el tipo de archivo de entrada y la ubicación de require():
Si el archivo de entrada tiene la extensión
.jsypackage.jsondefine"type": "module",errorMessageincluye una línea adicional:This file is being treated as an ES module because it has a '.js' file extension and '/code/package.json' contains "type": "module". To treat it as a CommonJS script, rename it to use the '.cjs' file extension.Si
require()se llama dentro de la función controladora en lugar del nivel superior del módulo,errorMessageesrequire is not defined.
Causa
require() es la función de carga del sistema de módulos CommonJS y no está disponible en el ámbito de los módulos ES. Una vez que un archivo se identifica como módulo ES, Node.js no inyecta variables de CommonJS como require, module ni exports.
Solución
Elija uno de los siguientes métodos según la estructura de su código:
Reescriba
require()como instruccionesimportde módulos ES. Para cargar un módulo de forma dinámica, utilice la expresiónimport().Si desea conservar la sintaxis
require(), cambie la extensión del archivo de entrada a.cjs. No es necesario modificar la configuración del controlador de la función.
A continuación se muestra un ejemplo de la reescritura con módulos ES (archivo de entrada index.mjs):
// Import a Node.js built-in module and a local ES module file
import { createHash } from 'node:crypto';
import { helper } from './utils.mjs';
export const handler = async (event, context) => {
return createHash('sha256').update(helper()).digest('hex');
};
En el siguiente ejemplo se muestra cómo cargar un módulo de forma dinámica:
const crypto = await import('node:crypto');
A continuación se muestra un ejemplo con la sintaxis de CommonJS (archivo de entrada index.cjs):
const crypto = require('crypto');
exports.handler = async (event, context) => {
return crypto.createHash('sha256').digest('hex');
};
Nota: Para cargar una dependencia de terceros (comolodash), ejecute primeronpm installde manera local. Después, empaquete y despliegue el directorionode_modulesjunto con su código. En los módulos ES, puede hacer referencia a una dependencia de CommonJS mediante una importación predeterminada; por ejemplo,import _ from 'lodash';.
Los módulos ES solo son compatibles con los entornos de ejecución de Node.js 18 y posteriores. En los entornos de Node.js 16 y anteriores, el archivo de entrada .mjs no se carga. La invocación devuelve "errorMessage": "Module '/code/index.js' is missing." y "errorType": "FunctionUnhandledError: ImportModuleError".