express框架应用接入阿里云函数计算

本文涉及的产品
函数计算FC,每月15万CU 3个月
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: 由于业务需要接触阿里云函数计算,为保证已有的 nodejs 应用迁移至阿里云函数计算。经过两天的摸索之后得到一些 express.js 应用迁移至函数计算的一些方法。 涉及技术及框架: nodejs 阿里云函数计算 主要流程: 对比函数计算 http 触发器 与 express 的相同点和不同点。

由于业务需要接触阿里云函数计算,为保证已有的 nodejs 应用迁移至阿里云函数计算。经过两天的摸索之后得到一些 express.js 应用迁移至函数计算的一些方法。

  1. 涉及技术及框架:

    • nodejs
    • 阿里云函数计算
  2. 主要流程:

    1. 对比函数计算 http 触发器 与 express 的相同点和不同点,对原先的应用进行兼容处理
    2. 解决函数计算触发器和 express 框架的数据传递问题
    3. 测试迁移之后的应用稳定性
  3. 开整实现
    (1)对比函数计算 http 触发器,与普通的基于 express 的应用的不同
属性 函数计算 应用 普通 express 应用
触发方式 由 exports.XXX.handle 方法触发 通过监听指定端口的网络请求触发
接收到的参数 入口函数会得到(request,response,context) express 接收到(request,response)

由于原先的应用基与 express 开发,在迁移至函数计算之后将不能通过监听端口的网络请求触发 request 事件。那么参考 express 中 listen 的实现

app.listen = function listen() {
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};

因此只需通过向 http.createServer 传入 express 对象,来创建一个 http.server 实例。当函数计算触发器被触发,再通过server.emit(‘request’, requset , response ) 来触发express 应用的工作流。

(2)函数计算入口函数的参数的兼容性改造
只能从函数计算入口函数拿到request,response,context。但是request、response 并非 http.InComingMessage 、http.ServerResponse 实例,如何通过 server.emit(‘request’, req , res ) 将入口函数传入的信息传入 express 工作流中。我们需要对 requset、response 进行改造

request  结构体:

headers:<map>, //存放来自 HTTP 客户端的键值对
path:<string>, //为 HTTP URL
queries:<map>, // 类型,存放来自 HTTP URL 中的 query 部分的 key - value 键值对, value 的类型可以为字符串或是数组
method:<string>, // 类型,HTTP 方法
clientIP:<string>, // 类型,client 的 IP 地址
url:<string>, // 类型,request 的 url
response 结构体:
response.setStatusCode(statusCode) : 设置 status code
param statusCode : (required, type integer)
response.setHeader(headerKey, headerValue) :设置 header
param headerKey : (required, type string)
param headerValue : (required, type string)
response.deleteHeader(headerKey) :删除 header
param headerKey: (required, type string)
response.send(body): 发送 body
param body: (required, typeBuffer or a string or a stream.Readable )

http.InComingMessage 结构体:

参考 http://nodejs.cn/api/http.html#http_class_http_incomingmessage

http.ServerResponse 结构体:

参考http://nodejs.cn/api/http.html#http_class_http_serverresponse

其中 express 应用中的 req 和 res 实现了很多封装的方法,所以需要根据自己的需要来进行兼容性改造,以下是我的改造代码片段:

const http = require('http');
const express = require('express');

const app = express()

const FCServer = http.createServer(app);

module.exports.handler = (request, response, context) => {
  try {
    // 通过 app.request 和 app.response 创建 inComimgMessage 和serverResponse
    const inComimgMessage = Object.create(app.request);
    const serverResponse = Object.create(app.response);

    // 将 request 的部分信息赋值给 inComimgMessage
    inComimgMessage.headers = request.headers;
    inComimgMessage.method = request.method;
    inComimgMessage.path = request.path;
    inComimgMessage.url = request.path;
    inComimgMessage.query = request.queries;

    // 使用 response 的方法替换掉 serverResponse 的一些方法
    serverResponse.setHeader = (key, value) => response.setHeader(key, value);
    serverResponse.end = (data, encoding, callback) => {
      response.send(data);
    };
    serverResponse.send = serverResponse.end;

    serverResponse.status = (code) => {
        response.setStatusCode(code);
    };

    serverResponse.writeHead = (code, message, headers) => {
      response.setStatusCode(code);
    };

    serverResponse.sendStatus = (code) => {
      response.setStatusCode(code);
      response.send(code);
    };

    serverResponse.json = (body) => {
      response.setHeader('content-type', 'application/json');
      if (typeof body === 'string') {
         response.send(body);
      } else {
         response.send(JSON.parse(body));
      }
    };

    FCServer.emit('request', inComimgMessage, serverResponse);
  } catch (e) {
    console.log(e);
    response.send(JSON.stringify({ request, response, context, e }));
  } 
};

(3)数据接入:
在函数计算中,获取 http 请求的 body 信息需要使用 getRawBody 方法,通过其回调函数我们可以得到 body 信息,因此我们需要在 getRawBody 内触发 request 事件。

    getRawBody(request, function (err, body) {
      if (request.method === 'POST') {
        inComimgMessage.body = JSON.parse(decodeURIComponent(body.toString()));
      }
      FCServer.emit('request', inComimgMessage, serverResponse);
    });
相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
23天前
|
SQL 分布式计算 Serverless
鹰角网络:EMR Serverless Spark 在《明日方舟》游戏业务的应用
鹰角网络为应对游戏业务高频活动带来的数据潮汐、资源弹性及稳定性需求,采用阿里云 EMR Serverless Spark 替代原有架构。迁移后实现研发效率提升,支持业务快速发展、计算效率提升,增强SLA保障,稳定性提升,降低运维成本,并支撑全球化数据架构部署。
191 56
鹰角网络:EMR Serverless Spark 在《明日方舟》游戏业务的应用
|
23天前
|
分布式计算 运维 搜索推荐
立马耀:通过阿里云 Serverless Spark 和 Milvus 构建高效向量检索系统,驱动个性化推荐业务
蝉妈妈旗下蝉选通过迁移到阿里云 Serverless Spark 及 Milvus,解决传统架构性能瓶颈与运维复杂性问题。新方案实现离线任务耗时减少40%、失败率降80%,Milvus 向量检索成本降低75%,支持更大规模数据处理,查询响应提速。
139 57
|
1月前
|
人工智能 开发框架 安全
Serverless MCP 运行时业界首发,函数计算让 AI 应用最后一公里提速
作为云上托管 MCP 服务的最佳运行时,函数计算 FC 为阿里云百炼 MCP 提供弹性调用能力,用户只需提交 npx 命令即可“零改造”将开源 MCP Server 部署到云上,函数计算 FC 会准备好计算资源,并以弹性、可靠的方式运行 MCP 服务,按实际调用时长和次数计费,欢迎你在阿里云百炼和函数计算 FC 上体验 MCP 服务。
251 29
|
9天前
|
人工智能 运维 安全
阿里云 Serverless 助力海牙湾构建弹性、高效、智能的 AI 数字化平台
海牙湾(G-Town)是一家以“供应链+场景+技术+AI”为核心驱动力的科技公司,致力于为各行业提供数字化转型解决方案。通过采用阿里云Serverless架构,解决了弹性能力不足、资源浪费与运维低效的问题。SAE全托管特性降低了技术复杂度,并计划进一步探索Serverless与AI结合,推动智能数字化发展。海牙湾业务覆盖金融、美妆、能源等领域,与多家知名企业建立战略合作,持续优化用户体验和供应链决策能力,保障信息安全并创造可量化的商业价值。未来,公司将深化云原生技术应用,助力更多行业实现高效数字化转型。
|
4月前
|
人工智能 运维 物联网
云大使 X 函数计算 FC 专属活动上线!享返佣,一键打造 AI 应用
如今,AI 技术已经成为推动业务创新和增长的重要力量。但对于许多企业和开发者来说,如何高效、便捷地部署和管理 AI 应用仍然是一个挑战。阿里云函数计算 FC 以其免运维的特点,大大降低了 AI 应用部署的复杂性。用户无需担心底层资源的管理和运维问题,可以专注于应用的创新和开发,并且用户可以通过一键部署功能,迅速将 AI 大模型部署到云端,实现快速上线和迭代。函数计算目前推出了多种规格的云资源优惠套餐,用户可以根据实际需求灵活选择。
|
6天前
|
人工智能 弹性计算 运维
阿里云邀请您参加 2025 中国 Serverless 用户调查
阿里云邀请您参加 2025 中国 Serverless 用户调查
|
1月前
|
Cloud Native Serverless 流计算
云原生时代的应用架构演进:从微服务到 Serverless 的阿里云实践
云原生技术正重塑企业数字化转型路径。阿里云作为亚太领先云服务商,提供完整云原生产品矩阵:容器服务ACK优化启动速度与镜像分发效率;MSE微服务引擎保障高可用性;ASM服务网格降低资源消耗;函数计算FC突破冷启动瓶颈;SAE重新定义PaaS边界;PolarDB数据库实现存储计算分离;DataWorks简化数据湖构建;Flink实时计算助力风控系统。这些技术已在多行业落地,推动效率提升与商业模式创新,助力企业在数字化浪潮中占据先机。
148 12
|
3月前
|
存储 分布式计算 物联网
美的楼宇科技基于阿里云 EMR Serverless Spark 构建 LakeHouse 湖仓数据平台
美的楼宇科技基于阿里云 EMR Serverless Spark 建设 IoT 数据平台,实现了数据与 AI 技术的有效融合,解决了美的楼宇科技设备数据量庞大且持续增长、数据半结构化、数据价值缺乏深度挖掘的痛点问题。并结合 EMR Serverless StarRocks 搭建了 Lakehouse 平台,最终实现不同场景下整体性能提升50%以上,同时综合成本下降30%。
385 58
|
1月前
|
人工智能 开发框架 运维
Serverless MCP 运行时业界首发,函数计算让 AI 应用最后一公里提速
Serverless MCP 运行时业界首发,函数计算支持阿里云百炼 MCP 服务!阿里云百炼发布业界首个全生命周期 MCP 服务,无需用户管理资源、开发部署、工程运维等工作,5 分钟即可快速搭建一个连接 MCP 服务的 Agent(智能体)。作为云上托管 MCP 服务的最佳运行时,函数计算 FC 为阿里云百炼 MCP 提供弹性调用能力。
199 0
 Serverless MCP 运行时业界首发,函数计算让 AI 应用最后一公里提速
|
2月前
|
人工智能 运维 架构师
Serverless + AI 让应用开发更简单,加速应用智能化
Serverless + AI 让应用开发更简单,加速应用智能化
109 5

相关产品

  • 函数计算