O Function Compute captura erros lançados pela sua função Node.js e retorna uma resposta estruturada. Esta página aborda as duas categorias de erros que funções Node.js podem gerar e explica como interpretar os códigos de status HTTP do service.
Tipos de erro
Exceções capturadas
Quando sua função lança uma exceção, o Function Compute a captura e retorna um objeto JSON com três campos:
|
Campo |
Descrição |
|
|
A string da mensagem de erro |
|
|
O nome da classe de erro JavaScript |
|
|
Um array de frames da pilha de execução |
Módulos ECMAScript
A sintaxe de módulos ECMAScript requer Node.js 18 ou posterior. O código de exemplo suporta implantação com um clique em ( 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');
};
Resposta de exemplo:
{
"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)"
]
}
Saídas anormais
Se sua função chamar process.exit() durante a execução, o runtime não conseguirá capturar um erro estruturado. Nesse caso, o service retorna uma mensagem genérica:
Módulos ECMAScript
A sintaxe de módulos ECMAScript requer Node.js 18 ou posterior.
export const handler = async (event, context) => {
process.exit(1);
};
Módulos CommonJS
exports.handler = function(event, context, callback) {
process.exit(1);
};
Resposta de exemplo:
{
"errorMessage": "Process exited unexpectedly before completing request (duration: 12ms, maxMemoryUsage: 0MB)"
}
Códigos de status HTTP
Uma resposta 2xx não garante o êxito da função. Verifique o cabeçalho de resposta X-Fc-Error-Type para detectar erros de função retornados com um código de status 2xx.
Quando uma invocação de função falha, o Function Compute retorna um código de status HTTP, um corpo de resposta e — para erros no nível da função — um cabeçalho de resposta X-Fc-Error-Type. Analise esses sinais para tratar erros no código ou exibi-los aos usuários finais.
|
Código de status |
Significado |
|
2xx |
O Function Compute recebeu a solicitação. Se a resposta incluir o cabeçalho |
|
4xx (exceto 429) |
O cliente que iniciou a invocação enviou uma solicitação inválida. |
|
429 |
A solicitação foi limitada. |
|
5xx |
Ocorreu um erro interno no Function Compute, a configuração da função é inválida ou há um problema de recurso. |
Para obter mais informações sobre erros de invocação, consulte Configure a retry mechanism.
Perguntas frequentes
require is not defined in ES module scope
Sintoma
Quando o arquivo de entrada de uma função Node.js é carregado como um módulo ES (a extensão do arquivo é .mjs ou package.json define "type": "module") e o código usa require() para carregar módulos, a invocação retorna o código de status HTTP 200, os cabeçalhos de resposta incluem X-Fc-Error-Type: InvocationError e o corpo da resposta contém o seguinte erro:
{
"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)"
]
}
O conteúdo do erro varia conforme o tipo de arquivo de entrada e a localização de require():
Se o arquivo de entrada tiver a extensão
.jsepackage.jsondefinir"type": "module",errorMessageincluirá uma linha 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.Caso
require()seja chamado dentro da função handler em vez de no nível superior do módulo,errorMessageserárequire is not defined.
Causa
require() é a função de carregamento do sistema de módulos CommonJS e não está disponível no escopo de módulos ES. Depois que um arquivo é identificado como módulo ES, o Node.js não injeta variáveis CommonJS como require, module e exports.
Solução
Escolha um dos métodos a seguir com base na estrutura do seu código:
Reescreva
require()como instruçõesimportde módulo ES. Para carregar um módulo dinamicamente, utilize a expressãoimport().Para manter a sintaxe
require(), renomeie a extensão do arquivo de entrada para.cjs. Não é necessário alterar a configuração do handler da função.
O exemplo a seguir mostra a reescrita para módulo ES (arquivo 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');
};
Este exemplo demonstra como carregar um módulo dinamicamente:
const crypto = await import('node:crypto');
Já o exemplo abaixo ilustra a sintaxe CommonJS (arquivo de entrada index.cjs):
const crypto = require('crypto');
exports.handler = async (event, context) => {
return crypto.createHash('sha256').digest('hex');
};
Observação: Para carregar uma dependência de terceiros (comolodash), executenpm installlocalmente primeiro e depois empacote e implante o diretórionode_modulesjunto com seu código. Em módulos ES, referencie uma dependência CommonJS usando uma importação padrão, por exemplo,import _ from 'lodash';.
Os módulos ES são suportados apenas nos runtimes Node.js 18 e posteriores. Nos runtimes Node.js 16 e anteriores, um arquivo de entrada .mjs não é carregado, e a invocação retorna "errorMessage": "Module '/code/index.js' is missing." e "errorType": "FunctionUnhandledError: ImportModuleError".