Function Compute, Node.js işlevinizin oluşturduğu hataları yakalar ve yapılandırılmış bir yanıt döndürür. Bu konuda, Node.js işlevlerinin üretebileceği iki hata kategorisi ve hizmetten gelen HTTP durum kodlarının nasıl yorumlanacağı açıklanmaktadır.
Hata türleri
Yakalanan özel durumlar
İşleviniz bir özel durum oluşturduğunda Function Compute bunu yakalar ve üç alan içeren bir JSON nesnesi döndürür:
| Alan | Açıklama |
|---|---|
errorMessage |
Hata mesajı dizesi |
errorType |
JavaScript hata sınıfı adı |
stackTrace |
Yığın çerçevelerinden oluşan bir dizi |
ECMAScript modülleri
ECMAScript modül sözdizimi Node.js 18 veya sonraki sürümleri gerektirir. Örnek kod tek tıkla dağıtımı destekler ( nodejs-fc-err-es ).
export const handler = async (event, context) => {
throw new Error('oops');
};
CommonJS modülleri
exports.handler = function(event, context, callback) {
throw new Error('oops');
};
Örnek yanıt:
{
"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)"
]
}
Anormal çıkışlar
İşleviniz çalışırken process.exit() çağrısı yaparsa çalışma zamanı yapılandırılmış bir hatayı yakalayamaz. Hizmet bunun yerine genel bir mesaj döndürür:
ECMAScript modülleri
ECMAScript modül sözdizimi Node.js 18 veya sonraki sürümleri gerektirir.
export const handler = async (event, context) => {
process.exit(1);
};
CommonJS modülleri
exports.handler = function(event, context, callback) {
process.exit(1);
};
Örnek yanıt:
{
"errorMessage": "Process exited unexpectedly before completing request (duration: 12ms, maxMemoryUsage: 0MB)"
}
HTTP durum kodları
2xx yanıtı, işlevin başarıyla tamamlandığını garanti etmez. İşlev hatalarını tespit etmek için X-Fc-Error-Type yanıt üst bilgisini kontrol edin; bu hatalar 2xx durum koduyla döndürülebilir.
Bir işlev çağrısı başarısız olduğunda Function Compute bir HTTP durum kodu, bir yanıt gövdesi ve işlev düzeyindeki hatalar için bir X-Fc-Error-Type yanıt üst bilgisi döndürür. Kodunuzdaki hataları işlemek veya son kullanıcılara sunmak amacıyla bu sinyalleri inceleyin.
| Durum kodu | Anlamı |
|---|---|
| 2xx | Function Compute isteği aldı. Yanıt X-Fc-Error-Type üst bilgisini içeriyorsa bir işlev hatası oluşmuş demektir; örneğin, kodunuzda yakalanmamış bir özel durum. |
| 4xx (429 hariç) | Çağrıyı başlatan istemci geçersiz bir istek gönderdi. |
| 429 | İstek kısıtlandı (throttled). |
| 5xx | Function Compute içinde dahili bir hata oluştu, işlev yapılandırması geçersiz veya bir kaynak sorunu mevcut. |
Çağrı hataları hakkında daha fazla bilgi için bkz. Yeniden deneme mekanizması yapılandırma.
SSS
ES modülü kapsamında require tanımlı değil
Belirti
Node.js işlevinin giriş dosyası bir ES modülü olarak yüklendiğinde (dosya uzantısı .mjs ise veya package.json içinde "type": "module" ayarlanmışsa) ve kod modülleri yüklemek için require() kullanıyorsa çağrı HTTP durum kodu 200 ile döner, yanıt üst bilgilerinde X-Fc-Error-Type: InvocationError bulunur ve yanıt gövdesi aşağıdaki hatayı içerir:
{
"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)"
]
}
Hata içeriği, giriş dosyası türüne ve require() konumuna bağlı olarak değişir:
Giriş dosyasının uzantısı
.jsise vepackage.jsoniçinde"type": "module"ayarlıysaerrorMessageek bir satır içerir: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.require()modülün üst düzeyinde değil de işlev işleyicisi içinde çağrılıyorsaerrorMessagedeğerirequire is not definedolur.
Neden
require() CommonJS modül sisteminin yükleme işlevidir ve ES modülü kapsamında kullanılamaz. Bir dosya ES modülü olarak tanımlandığında Node.js require, module ve exports gibi CommonJS değişkenlerini enjekte etmez.
Çözüm
Kod yapınıza göre aşağıdaki yöntemlerden birini seçin:
require()ifadelerini ES modülüimportifadeleri olarak yeniden yazın. Bir modülü dinamik olarak yüklemek içinimport()ifadesini kullanın.require()sözdizimini korumak için giriş dosyasının uzantısını.cjsolarak değiştirin. İşlev işleyici yapılandırmasında değişiklik gerekmez.
Aşağıdaki örnek, ES modülü yeniden yazımını gösterir (giriş dosyası 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');
};
Aşağıdaki örnek, bir modülün dinamik olarak nasıl yükleneceğini gösterir:
const crypto = await import('node:crypto');
Aşağıdaki örnek, CommonJS sözdizimini gösterir (giriş dosyası index.cjs):
const crypto = require('crypto');
exports.handler = async (event, context) => {
return crypto.createHash('sha256').digest('hex');
};
Not: Üçüncü taraf bir bağımlılığı (örneğinlodash) yüklemek için öncelikle yerel ortamdanpm installkomutunu çalıştırın ve ardındannode_modulesdizinini kodunuzla birlikte paketleyip dağıtın. ES modüllerinde, varsayılan içe aktarma kullanarak bir CommonJS bağımlılığına başvurabilirsiniz; örneğin,import _ from 'lodash';.
ES modülleri yalnızca Node.js 18 ve sonraki sürüm çalışma zamanlarında desteklenir. Node.js 16 ve önceki sürüm çalışma zamanlarında .mjs giriş dosyası yüklenmez ve çağrı "errorMessage": "Module '/code/index.js' is missing." ile "errorType": "FunctionUnhandledError: ImportModuleError" değerlerini döndürür.