بدء مشروع برنامج جديد؟ تحقق من رمز Genie - مولد تطبيق مكدس كامل يقدم مشروع AWS الكامل مع رمز المصدر ، استنادًا إلى نموذج البيانات الخاص بك. مشتمل:
قم بتشغيل REST APIs وتطبيقات الويب الأخرى باستخدام إطار تطبيق Node.js الحالي (Express ، KOA ، HAPI ، SAILS ، وما إلى ذلك) ، أعلى AWS Lambda و Amazon API Gateway أو Azure.
npm install @codegenie/serverless-expressهل تريد الاستيقاظ والركض بسرعة؟ تحقق من مثال المبتدئين الأساسي الذي يتضمن:
إذا كنت ترغب في ترحيل تطبيق موجود إلى AWS Lambda ، يُنصح بالحصول على الحد الأدنى من المثال وتشغيله أولاً ، ثم نسخ مصدر التطبيق الخاص بك.
رمز AWS Lambda الوحيد الذي تحتاج إلى كتابته هو معالج بسيط مثل أدناه. جميع التعليمات البرمجية الأخرى التي يمكنك كتابتها كما تفعل عادة.
// lambda.js
const serverlessExpress = require ( '@codegenie/serverless-express' )
const app = require ( './app' )
exports . handler = serverlessExpress ( { app } )إذا احتاج تطبيقك إلى إجراء بعض مهام Bootstrap الشائعة مثل الاتصال بقاعدة بيانات قبل أن يتم إرسال الطلب إلى API ، فيمكنك استخدام النمط التالي (متوفر أيضًا في هذا المثال):
// lambda.js
require ( 'source-map-support/register' )
const serverlessExpress = require ( '@codegenie/serverless-express' )
const app = require ( './app' )
let serverlessExpressInstance
function asyncTask ( ) {
return new Promise ( ( resolve ) => {
setTimeout ( ( ) => resolve ( 'connected to database' ) , 1000 )
} )
}
async function setup ( event , context ) {
const asyncValue = await asyncTask ( )
console . log ( asyncValue )
serverlessExpressInstance = serverlessExpress ( { app } )
return serverlessExpressInstance ( event , context )
}
function handler ( event , context ) {
if ( serverlessExpressInstance ) return serverlessExpressInstance ( event , context )
return setup ( event , context )
}
exports . handler = handler رمز Azure المحدد الوحيد الذي تحتاج إلى كتابته هو index.js بسيط function.json . json مثل أدناه.
// index.js
const serverlessExpress = require ( '@codegenie/serverless-express' )
const app = require ( './app' )
const cachedServerlessExpress = serverlessExpress ( { app } )
module . exports = async function ( context , req ) {
return cachedServerlessExpress ( context , req )
} المعلمة "الاسم" المربوطة "name": "$return" مهمة لـ Serverless Express للعمل.
// function.json
{
"bindings" : [
{
"authLevel" : " anonymous " ,
"type" : " httpTrigger " ,
"direction" : " in " ,
"name" : " req " ,
"route" : " {*segments} "
},
{
"type" : " http " ,
"direction" : " out " ,
"name" : " $return "
}
]
}resolutionMode لاستخدام "CONTEXT" أو "CALLBACK"isBase64Encoded التلقائي دون تحديد binaryMimeTypes . استخدام binarySettings للتخصيص. بفضل dougmoscrop من https://github.com/dougmoscrop/serverless-httprespondWithErrors يجعل من السهل تصحيحها أثناء التطويرراجع الترقية.
تحديد ما إذا كان يجب ترميز الاستجابة BASE64 قبل إرجاعها إلى مصدر الحدث ، على سبيل المثال ، عند إرجاع الصور أو الملفات المضغوطة. هذا ضروري بسبب بوابة API ومصادر الأحداث الأخرى غير قادرة على التعامل مع الاستجابات الثنائية مباشرة. يكون مصدر الحدث مسؤولاً عن إعادة هذا الأمر إلى تنسيق ثنائي قبل إعادته إلى العميل.
بشكل افتراضي ، يتم تحديد ذلك بناءً على رؤوس content-encoding ونوع content-type الذي يتم إرجاعه بواسطة تطبيقك. إذا كنت بحاجة إلى تحكم إضافي في هذا ، فيمكنك تحديد binarySettings .
{
binarySettings : {
isBinary : ( { headers } ) => true ,
contentTypes : [ 'image/*' ] ,
contentEncodings : [ ]
}
}يجب أيضًا تحديد أي قيمة تقدمها هنا على API Gateway API. في سام ، يبدو هذا مثل:
ExpressApi :
Type : AWS::Serverless::Api
Properties :
StageName : prod
BinaryMediaTypes : ['image/*']'PROMISE' ) يدعم Lambda ثلاث طرق لإنهاء التنفيذ وإرجاع النتيجة: السياق ، رد الاتصال ، والوعد. بشكل افتراضي ، يستخدم التعبير عن Serverless دقة الوعد ، ولكن يمكنك تحديد "السياق" أو "رد الاتصال" إذا كنت بحاجة إلى تغيير هذا. إذا قمت بتحديد "رد الاتصال" ، فإن context.callbackWaitsForEmptyEventLoop = false تم تعيينه لك أيضًا.
serverlessExpress ( {
app ,
resolutionMode : 'CALLBACK'
} )process.env.NODE_ENV === 'development' ) قم بتعيين هذا إلى True للحصول على تعبير بدون خادم يتضمن تتبع مكدس الخطأ في حالة استثناء غير معقد. هذا مفيد بشكل خاص أثناء التطوير. بشكل افتراضي ، يتم تمكين هذا عند NODE_ENV === 'development' بحيث لا يتم إرجاع تتبع المكدس في الإنتاج.
Serverless-Express يدعم أصليًا بوابة API و ALB و Lambda@Edge. إذا كنت ترغب في استخدام Express مع خدمات AWS الأخرى المدمجة مع Lambda ، فيمكنك توفير تعيينات طلب/استجابة مخصصة عبر eventSource . انظر مثال المخصص Dynamodb.
function requestMapper ( { event } ) {
// Your logic here...
return {
method ,
path ,
headers
}
}
function responseMapper ( {
statusCode ,
body ,
headers ,
isBase64Encoded
} ) {
// Your logic here...
return {
statusCode ,
body ,
headers ,
isBase64Encoded
}
}
serverlessExpress ( {
app ,
eventSource : {
getRequest : requestMapper ,
getResponse : responseMapper
}
} ) يمكن تكوين وظيفة واحدة للتعامل مع أنواع إضافية من أحداث AWS:
بافتراض تكوين الوظيفة التالية في serverless.yml :
functions :
lambda-handler :
handler : src/lambda.handler
events :
- http :
path : /
method : get
- sns :
topicName : my-topic
- stream :
type : dynamodb
arn : arn:aws:dynamodb:us-east-1:012345678990:table/my-table/stream/2021-07-15T15:05:51.683
- sqs :
arn : arn:aws:sqs:us-east-1:012345678990:myQueue
- eventBridge :
pattern :
source :
- aws.cloudformationوالتكوين التالي:
serverlessExpress ( {
app ,
eventSourceRoutes : {
'AWS_SNS' : '/sns' ,
'AWS_DYNAMODB' : '/dynamodb' ,
'AWS_SQS' : '/sqs'
'AWS_EVENTBRIDGE' : '/eventbridge' ,
'AWS_KINESIS_DATA_STREAM' : '/kinesis' ,
'AWS_S3' : '/s3' ,
'AWS_STEP_FUNCTIONS' : '/step-functions' ,
'AWS_SELF_MANAGED_KAFKA' : '/self-managed-kafka' ,
}
} )بدلاً من ذلك ، للتعامل مع أحداث SNS فقط (مفاتيح الخريطة اختيارية )
serverlessExpress ( {
app ,
eventSourceRoutes : {
'AWS_SNS' : '/sns' ,
}
} ) سيتم POST الأحداث على الطرق التي تم تكوينها.
أيضًا ، لضمان نشر الأحداث من حدث داخلي وليس خارجيًا ، يوصى بشدة بتأكد من تطابقات رأس Host :
sns.amazonaws.comdynamodb.amazonaws.comsqs.amazonaws.comevents.amazonaws.comkinesis.amazonaws.com حدد إعدادات السجل التي يتم تمريرها إلى المسجل الافتراضي. حاليا ، يمكنك فقط تعيين level السجل.
{
logSettings : {
level : 'debug' // default: 'error'
}
} توفير كائن log مخصص مع info debug والطرق error . على سبيل المثال ، يمكنك تجاوز الافتراضي مع مثيل سجل Winston.
{
log : {
info ( message , additional ) {
console . info ( message , additional )
} ,
debug ( message , additional ) {
console . debug ( message , additional )
} ,
error ( message , additional ) {
console . error ( message , additional )
}
}
} تكشف هذه الحزمة وظيفة للحصول على كائنات event context بسهولة التي يتلقاها Lambda من مصدر الحدث.
const { getCurrentInvoke } = require ( '@codegenie/serverless-express' )
app . get ( '/' , ( req , res ) => {
const { event , context } = getCurrentInvoke ( )
res . json ( event )
} ) npx loadtest --rps 100 -k -n 1500 -c 50 https://xxxx.execute-api.us-east-1.amazonaws.com/prod/users
في 11/30 ، انتقلت مكتبة AWS Serverless Express من AWS إلى Vendia وسيتم إعادة تسميتها إلى @codegenie/serverless-express . وبالمثل ، سيتم إهمال حزمة aws-serverless-express NPM لصالح @codegenie/serverless-express.
سيستمر بريت أندروز ، المبدع الأصلي لمكتبة الخوادم السريعة ، في الحفاظ على المستودع ويمنحه الاهتمام والرعاية التي يستحقها. في الوقت نفسه ، سوف نبحث عن مساهمين إضافيين للمشاركة في تطوير وإشراف مكتبة Serverless Express. سيبقى AWS وفريق SAM متورطين في دور إداري إلى جانب شركة Vendia و Brett و New Saftains الذين سينضمون إلى المشروع.
نعتقد أن هذا هو أفضل مسار للعمل لضمان حصول العملاء الذين يستخدمون هذه المكتبة على أفضل دعم ممكن في المستقبل. لمعرفة المزيد حول هذه الخطوة أو أن تصبح مشرفًا لمكتبة Serverless Express الجديدة ، تواصل معنا من خلال مشكلة github في هذا المستودع.
أفضل ، فريق AWS Serverless ، فريق Brett & The Vendia