開始一個新的軟件項目?查看Code Genie-完整的堆棧應用程序生成器,該生成器可根據您的數據模型提供一個帶有源代碼的完整無服務器項目。包括:
使用現有Node.js應用程序框架(Express,Koa,Hapi,Sails等)運行REST API和其他Web應用程序,在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 } )如果您的應用程序需要執行一些常見的引導任務,例如在請求轉發到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 。
// 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"對於無服務器Express起作用很重要。
// function.json
{
"bindings" : [
{
"authLevel" : " anonymous " ,
"type" : " httpTrigger " ,
"direction" : " in " ,
"name" : " req " ,
"route" : " {*segments} "
},
{
"type" : " http " ,
"direction" : " out " ,
"name" : " $return "
}
]
}"CONTEXT"或"CALLBACK" resolutionModeisBase64Encoded重編碼而未指定binaryMimeTypes模擬。使用binarySettings來自定義。感謝https://github.com/dougmoscrop/serverless-http的@dougmoscroprespondWithErrors使得在開發過程中更容易調試請參閱upgrade.md從AWS-Serverless-express和 @codegenie/serverless-express 3.x升級
在返回事件源之前,在返回圖像或壓縮文件時,確定響應是否應為基本64。由於API網關和其他事件源無法直接處理二進制響應,因此這是必要的。然後,事件源負責將其轉換為二進制格式,然後再返回客戶。
默認情況下,這是根據您的應用程序返回的content-encoding和content-type標頭確定的。如果您需要對此進行其他控制,則可以指定binarySettings 。
{
binarySettings : {
isBinary : ( { headers } ) => true ,
contentTypes : [ 'image/*' ] ,
contentEncodings : [ ]
}
}您在這裡提供的任何值也應在API網關API上指定。在山姆中,這看起來像:
ExpressApi :
Type : AWS::Serverless::Api
Properties :
StageName : prod
BinaryMediaTypes : ['image/*']'PROMISE' ) Lambda支持結束執行並返回結果的三種方法:上下文,回調和承諾。默認情況下,無服務器表達式使用承諾分辨率,但是如果需要更改此問題,則可以指定“上下文”或“回調”。如果您指定“回調”,則context.callbackWaitsForEmptyEventLoop = false也為您設置。
serverlessExpress ( {
app ,
resolutionMode : 'CALLBACK'
} )process.env.NODE_ENV === 'development' )將其設置為true,以使無服務器表達式在未經治療的異常時包含錯誤堆棧跟踪。這在開發過程中特別有用。默認情況下,當NODE_ENV === 'development'時,啟用了這一點,以便在生產中不會返回堆棧跟踪。
無服務器表達本性支持API網關,Alb和Lambda@Edge。如果您想與與Lambda集成的其他AWS服務一起使用Express,則可以通過eventSource提供自己的自定義請求/響應映射。請參閱“自定義示例”示例。
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無服務器Express庫從AWS轉移到Vendia,並將重新命名為@codegenie/serverless-express 。同樣,將對 @CodeGenie/serverless-express的aws-serverless-express NPM軟件包進行棄用。
Serverless Express庫的原始創建者Brett Andrews將繼續維護存儲庫,並給予其應有的關注和關心。同時,我們將尋找其他貢獻者,以參與無服務器Express庫的開發和管理。 AWS和SAM團隊將與Vendia,Brett以及將加入該項目的新維護者一起參與行政職務。
我們認為,這是確保使用此圖書館的客戶在將來獲得最佳支持的最佳行動。要了解有關此舉的更多信息或成為新的無服務器Express庫的維護者,請通過此存儲庫的GitHub問題與我們聯繫。
最好的是AWS無服務器團隊,Brett&Vendia團隊