serverless-express 正在参加 2021 年度 OSC 中国开源项目评选,请投票支持!
serverless-express 在 2021 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
2021 年度 OSC 中国开源项目评选 正在火热进行中,快来投票支持你喜欢的开源项目!
2021 年度 OSC 中国开源项目评选 >>> 中场回顾
serverless-express 获得 2021 年度 OSC 中国开源项目评选「最佳人气项目」 !
授权协议 Apache-2.0 License
开发语言 JavaScript
操作系统 跨平台
软件类型 开源软件
所属分类 Web应用开发
开源组织
地区 不详
投 递 者 首席测试
适用人群 未知
收录时间 2021-11-30

软件简介

Serverless Express by Vendia

Build Status npm npm Contributor Covenant

vendia logo

Run REST APIs and other web applications using your existing Node.js application framework (Express, Koa, Hapi, Sails, etc.), on top of AWS Lambda and Amazon API Gateway.

npm install @vendia/serverless-express

Quick Start/Example

Want to get up and running quickly? Check out our basic starter example that includes:

If you want to migrate an existing application to AWS Lambda, it's advised to get the minimal example up and running first, and then copy your application source in.

Minimal Lambda handler wrapper

The only AWS Lambda specific code you need to write is a simple handler like below. All other code you can write as you normally do.

// lambda.js
const serverlessExpress = require('@vendia/serverless-express')
const app = require('./app')
exports.handler = serverlessExpress({ app })

Async setup Lambda handler

If your application needs to perform some common bootstrap tasks such as connecting to a database before the request is forward to the API, you can use the following pattern (also available in this example):

// lambda.js
require('source-map-support/register')
const serverlessExpress = require('@vendia/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

4.x

  1. Improved API - Simpler for end-user to use and configure.
  2. Promise resolution mode by default. Can specify resolutionMode to use "CONTEXT" or "CALLBACK"
  3. Additional event sources - API Gateway V1 (REST API), API Gateway V2 (HTTP API), ALB, Lambda@Edge
  4. Custom event source - If you have another event source you'd like to use that we don't natively support, check out the DynamoDB Example
  5. Implementation uses mock Request/Response objects instead of running a server listening on a local socket. Thanks to @dougmoscrop from https://github.com/dougmoscrop/serverless-http
  6. Automatic isBase64Encoded without specifying binaryMimeTypes. Use binarySettings to customize. Thanks to @dougmoscrop from https://github.com/dougmoscrop/serverless-http
  7. respondWithErrors makes it easier to debug during development
  8. Node.js 12+
  9. Improved support for custom domain names

See UPGRADE.md to upgrade from aws-serverless-express and @vendia/serverless-express 3.x

API

binarySettings

Determine if the response should be base64 encoded before being returned to the event source, for example, when returning images or compressed files. This is necessary due to API Gateway and other event sources not being capable of handling binary responses directly. The event source is then responsible for turning this back into a binary format before being returned to the client.

By default, this is determined based on the content-encoding and content-type headers returned by your application. If you need additional control over this, you can specify binarySettings.

{
  binarySettings: {
    isBinary: ({ headers }) => true,
    contentTypes: ['image/*'],
    contentEncodings: []
  }
}

Any value you provide here should also be specified on API Gateway API. In SAM, this looks like:

ExpressApi:
  Type: AWS::Serverless::Api
  Properties:
    StageName: prod
    BinaryMediaTypes: ['image/*']

resolutionMode (default: 'PROMISE')

Lambda supports three methods to end the execution and return a result: context, callback, and promise. By default, serverless-express uses promise resolution, but you can specify 'CONTEXT' or 'CALLBACK' if you need to change this. If you specify 'CALLBACK', then context.callbackWaitsForEmptyEventLoop = false is also set for you.

serverlessExpress({
  app,
  resolutionMode: 'CALLBACK'
})

respondWithErrors (default: process.env.NODE_ENV === 'development')

Set this to true to have serverless-express include the error stack trace in the event of an unhandled exception. This is especially useful during development. By default, this is enabled when NODE_ENV === 'development' so that the stack trace isn't returned in production.

Advanced API

eventSource

serverless-express natively supports API Gateway, ALB, and Lambda@Edge. If you want to use Express with other AWS Services integrated with Lambda you can provide your own custom request/response mappings via eventSource. See the custom-mapper-dynamodb example.

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
  }
})

eventSourceRoutes

Introduced in @vendia/serverless-express@4.4.0 native support for aws:sns and aws:dynamodb events were introduced.

A single function can be configured to handle events from SNS and DynamoDB, as well as the previously supported events.

Assuming the following function configuration in 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

And the following configuration:

serverlessExpress({
  app,
  eventSourceRoutes: {
    'AWS_SNS': '/sns',
    'AWS_DYNAMODB': '/dynamodb'
  }
})

Events from SNS and DynamoDB will POST to the routes configured in Express to handle /sns and /dynamodb, respectively.

Also, to ensure the events propagated from an internal event and not externally, it is highly recommended to ensure the Host header matches:

  • SNS: sns.amazonaws.com
  • DynamoDB: dynamodb.amazonaws.com

logSettings

Specify log settings that are passed to the default logger. Currently, you can only set the log level.

{
  logSettings: {
    level: 'debug' // default: 'error'
  }
}

log

Provide a custom log object with info, debug and error methods. For example, you could override the default with a Winston log instance.

{
  log: {
    info (message, additional) {
      console.info(message, additional)
    },
    debug (message, additional) {
      console.debug(message, additional)
    },
    error (message, additional) {
      console.error(message, additional)
    }
  }
}

Accessing the event and context objects

This package exposes a function to easily get the event and context objects Lambda receives from the event source.

const { getCurrentInvoke } = require('@vendia/serverless-express')
app.get('/', (req, res) => {
  const { event, context } = getCurrentInvoke()

  res.json(event)
})

Why run Express in a Serverless environment

Loadtesting

npx loadtest --rps 100 -k -n 1500 -c 50 https://xxxx.execute-api.us-east-1.amazonaws.com/prod/users

AWS Serverless Express has moved

On 11/30, the AWS Serverless Express library moved from AWS to Vendia and will be rebranded to @vendia/serverless-express. Similarly, the aws-serverless-express NPM package will be deprecated in favor of @vendia/serverless-express.

Brett, the original creator of the Serverless Express library, will continue maintaining the repository and give it the attention and care it deserves. At the same time, we will be looking for additional contributors to participate in the development and stewardship of the Serverless Express library. AWS and the SAM team will remain involved in an administrative role alongside Vendia, Brett, and the new maintainers that will join the project.

We believe this is the best course of action to ensure that customers using this library get the best possible support in the future. To learn more about this move or become a maintainer of the new Serverless Express library, reach out to us through a GitHub issue on this repository.

Best, The AWS Serverless team, Brett & the Vendia team

展开阅读全文

代码

评论 (0)

加载中
更多评论
暂无内容
2016/12/08 19:34

Express express-session

express-session的一些方法: 1. Session.destroy():删除session,当检测到客户端关闭时调用。 2. Session.reload():当session有修改时,刷新session。 3. Session.regenerate():将已有session初始化。 4. Session.save():保存session。 内存存储 方式实例代码: 一旦我们将express-session中间件用use挂载后,我们可以很方便的通过req参数来存储和访问session对象的数据。req.session是一个JSON格式的JavaScript对象,我们可以...

0
2
2016/12/08 19:21

Express express-session

express-session中间件 express-session中间件将会话数据存储在服务器上;它仅将会话标识(而非会话数据)保存在 cookie 中。从1.5.0版本开始, express-session不再依赖cookie-parser,直接通过req/res读取/写入;默认存储位置内存存储(服务器端), 安装: npm install express-session 主要方法 : session(options) 通过option来设置session存储,除了session ID外,session中的任何数据都不存储在cookie中。 options可选参数: 1. ...

0
2
2016/12/08 18:49

Express express-session

会话是什么? 会话是一种持久的网络协议,用于完成服务器和客户端之间的一些交互行为。会话是一个比连接粒度更大的概念,一次会话可能包含多次连接,每次连接都被认为是会话的一次操作。http会话是无状态的, 解决http无状态的方法有cookie和session; Session一般译作会话,牛津词典对其的解释是进行某活动连续的一段时间。在web应用的用户看来,session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而sessi...

0
0
发表了博客
2019/04/07 18:35

express---express-session axios

express---express-session axios 使用axios访问后台获取session中的属性值为undefined 在main.js中导入axios import axios from 'axios' axios.defaults.withCredentials = true//关键 Vue.prototype.$http = axios server.js中编写接口 var express=require('express'); var session = require("express-session"); var cookieParser = require("cookie-parser"); var app =express(); var router = express.Router(); app....

0
0
发表于大前端专区
2018/02/01 23:22

Express中间件--express-session

npm install --save express-session var session = require('express-session') 设置session-cookie const Options = { secret: 'keyboard cat', // 必须,This is the secret used to sign the session ID cookie genid: function(req) { return genuuid(); // use UUIDs for session IDs, 默认使用 uid-safe library 来生成 IDs. }, name: 'session_id', // 设置 ...

0
0
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
暂无内容
0 评论
0 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部