Node Functions 开发者指南

Ethan MercerEthan Mercer
30 分钟阅读
Spt 4, 2025

什么是 Node Functions?

Node Functions 是 EdgeOne 推出的无服务器函数解决方案,为开发者提供强大而灵活的动态后端能力。通过在项目的 /node-functions 目录中创建函数,您的代码即可自动转化为高性能的 Node.js API 端点。

这些端点能够轻松应对各类后端场景——数据库交互、第三方 API 对接、表单处理、数据转换等复杂操作,同时完全屏蔽了服务器运维的繁琐细节。这种无服务器架构让 Node Functions 成为构建现代化、可扩展应用的理想选择。

集成 Node Functions 的关键优势

体验前后端代码管理统一的真正全栈开发。在单个 Git 仓库中存放前端静态资产和后端函数逻辑,无缝共享配置、环境变量和部署流程。只需一个"git push"命令 EdgeOne Pages 即可自动部署整个应用程序栈,大幅简化开发工作流程,同时最小化运营开销和维护复杂性。

充分利用触手可及的庞大 npm 生态系统。无缝集成数百万个 npm 包,包括数据库驱动、实用程序库和 SDK 到您的无服务器函数中。这个丰富的生态系统使开发者能够专注于创新业务逻辑,而不是从头重建现有解决方案。

Node Functions 的十大基本用例和功能

Node Functions 的扩展远远超出了传统的 CRUD 操作,它使开发者能够执行复杂的计划任务、处理安全支付、发送实时通知以及实现各种高级功能。探索以下在 EdgeOne Pages 中使用的十个最实用的用例,每个用例都旨在为您的项目功能和用户体验带来改进。

欢迎参考我们的代码仓库,其中包含以下示例代码的完整结构。

API 请求处理和管理

API 请求处理是现代 Web 应用程序的基础支柱,接收和响应不同的 HTTP 请求(GET、POST、PUT、DELETE)。这一基本功能为前端应用程序提供强大的数据接口服务,建立安全高效的前后端数据通信关键桥梁。

以下是简化 GET 请求的服务端示例。

export async function onRequest(context) {
  const { request } = context;
  
  try {
    if (request.method === 'GET') {
      const users = [
        { id: 1, name: 'John', email: 'john@example.com' },
      ];
      return new Response(JSON.stringify(users), {
        headers: { 'Content-Type': 'application/json' }
      });
    }
    
    return new Response(JSON.stringify({ error: 'Resource not found' }), {
      status: 404,
      headers: { 'Content-Type': 'application/json' }
    });
  } catch (error) {
    // Handle errors
    return new Response(JSON.stringify({ error: 'Internal server error' }), {
      status: 500,
      headers: { 'Content-Type': 'application/json' }
    });
  }
}

集成 OpenAI API 服务

Node.js 环境原生支持标准 OpenAI SDK 集成,快速赋能 AI 功能。通过环境变量安全管理 API 密钥,在确保企业级安全的同时,保持代码的灵活性与部署的敏捷性。 以下示例展示了 Deepseek 文本生成模型的集成方案。

import OpenAI from "openai";
import getRequestBody from '../getRequestBody.js';

export async function onRequest(context) {
  const { request } = context;
  
  try {
    // Parse request body
    const { prompt, maxTokens = 500 } = await getRequestBody(request);
    
    if (!prompt) {
      return new Response(JSON.stringify({ error: 'No prompt provided' }), { status: 400 });
    }
    
    // Initialize OpenAI client
    const openai = new OpenAI({
      baseURL: process.env.OPENAI_API_URL,
      apiKey: process.env.OPENAI_API_KEY
    });
    
    // Call API to generate text
    const completion = await openai.chat.completions.create({
      model: "deepseek-ai/DeepSeek-R1-0528",
      messages: [
        { role: "system", content: "You are a helpful AI assistant." },
        { role: "user", content: prompt }
      ],
      max_tokens: maxTokens
    });
    
    //.stringify({
      generatedText: completion.choices[0].message.content
    }), {
      headers: { 'Content-Type': 'application/json' }
    });
    
  } catch (error) {
    return new Response(JSON.stringify({ error: error.message }), { status: 500 });
  }
}

数据库集成和连接

EdgeOne Pages 在函数内无缝集成各类数据库操作,全面支持主流数据库的连接与 CRUD 操作。基于无服务器架构,轻松实现数据持久化、实时查询和复杂数据处理,为动态应用提供强大的后端数据支撑。

对于数据库操作,我们提供完整的数据库部署模板,您可以直接使用或参考模板代码开发您的项目。

身份认证和会话控制

通过 JWT Token 在函数中实现无状态认证。支持用户注册、登录验证、令牌生成与验证等核心功能,可与各类数据库服务灵活配合存储用户信息,并支持集成 Supabase 等第三方认证服务,加速用户管理系统开发。

以下是简化的登录认证实现。

const JWT_SECRET = process.env.JWT_SECRET;
const JWT_EXPIRES_IN = '24h';

function hashPassword(password) {
  return crypto.createHash('sha256').update(password).digest('hex');
}

function generateToken(payload) {
  return jwt.sign(payload, JWT_SECRET, { expiresIn: JWT_EXPIRES_IN });
}

export async function onRequest(context) {
  const { request } = context;
  
  try {
    return await handleLogin(request);
  } catch (error) {
    // errors(request) {
  const data = await getRequestBody(request);
  const { email, password } = data;
  
  if (!email || !password) {
    ...
  }
  
  const user = users.find(u => u.email === email);
  if (!user) {
    ...
  }
  
  const hashedPassword = hashPassword(password);
  if (user.password !== hashedPassword) {
    ...
  }
  
  const token = generateToken({ userId: user.id });
  
  const { password: _, ...userWithoutPassword } = user;
  return new Response(JSON.stringify({
    message: 'Login successful',
    user: userWithoutPassword,
    token
  }), {
    headers: { 'Content-Type': 'application/json' }
  });
}

电子邮件/推送通知发送

通过电子邮件服务提供商 API 如 Resend、Nodemailer、SendGrid、AWS SES 在函数中实现电子邮件发送,支持 HTML 富文本、附件和模板渲染等功能。此外,集成包括短信和推送通知在内的多渠道消息服务,适用于用户注册验证、订单通知和系统提醒等场景。

探索以下 Resend 实现示例。

export async function onRequest(context) {
  const { request } = context;
  const resend = new Resend(process.env.RESEND_API_KEY);


  try {
    const requestBody = await getRequestBody(request);
    
    // Validate request parameters
    if (!requestBody || !requestBody.email) {
      return new Response(JSON.stringify({ error: 'Missing email address' }), {
        status: 400,
        headers: { 'Content-Type': 'application/json' }
      });
    }
    
    const { email } = requestBody;
    const name = requestBody.name || 'User';
    const subject = requestBody.subject || 'Welcome to our service';
    const customMessage = requestBody.message || '';
    
    // Send email
    const data = await resend.emails.send({
      from: 'noreply@wenyiqing.email', // Replace with your sender email
      to: [email],
      subject: subject,
      html: `
        <div style="font-family: sans-serif; max-width: 600px; margin: 0 auto;">
          <h2>Hello, ${name}!</h2>
          <p>Thank you for using our service.</p>p>${customMessage}</p>` : ''}
          <p>If you have any questions, please feel free to contact us.</p>
          <p>Best regards,<br>The Team</p>
        </div>
      `
    });
    if(data.error) {
      // errors handling
    }
    // Return success response
    return new Response(JSON.stringify({ success: true, messageId: data.id }), {
      status: 200,
      headers: { 'Content-Type': 'application/json' }
    });
  } catch (error) {
    // errors handling
  }
}

数据格式转换

在无服务器函数中释放强大的通用格式转换能力。充分利用 Node.js 广泛的解析生态系统—包括行业验证的库如 xml2js、csv-parser、xlsx 和 pdfkit,轻松编排涵盖文件处理、API 集成和企业报告场景的复杂数据工作流。

部署为专用数据转换微服务,提供标准化格式转换 API,赋能前端应用程序和外部系统,同时显著降低跨平台数据交换复杂性。

探索这个简化的 CSV 转 XLSX 转换示例。

import getRequestBody from '../getRequestBody.js';
import * as XLSX from 'xlsx';

function convertCsvToExcel(csvData, options = {}) {
  	// Data conversion logic
}

export async function onRequest(context) {
  const { request } = context;
  
  try {
    // Get CSV data from request body
    const requestBody = await getRequestBody(request);
    const csvData = requestBody;
    
    // Get options from URL parameters
    ...
    const options = {...};
    
    // Convert CSV to Excel
    const excelBuffer = convertCsvToExcel(csvData, options);
    
    // Return Excel file as downloadable
    const filename = params.get('filename') || 'data.xlsx';
    return new Response(excelBuffer, {
      status: 200,
      headers: {
        'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
        'Content-Disposition': `attachment; filename="${filename}"`
      }
    });
  } catch (error) {
    // Simple error response
    return new Response(JSON.stringify({ error: error.message }), { status: 400 });
  }
}

// Note: CSV validation logic omitted for brevity
// In production, you would validate CSV format before conversion

Webhook 事件处理

在无服务器函数中构建企业级、高可用的 Webhook 端点,专为事件驱动架构范式无缝对齐而设计。支持来自 GitHub、Stripe 等领先平台的实时事件流,同时实施加密签名验证以保证请求来源的真实性和安全协议的无懈可击。

一下是简化的 Webhook 处理 GitHub 推送事件集成示例。

export async function onRequest(context) {
  const { request, env } = context;
  try {
    const webhookSecret = env.GITHUB_WEBHOOK_SECRET;
    
    const clonedRequest = cloneRequest(request);
    const isSignatureValid = await verifyGitHubSignature(clonedRequest, webhookSecret);
    
    if (!isSignatureValid) {
      // errors handling
    }
    // Get event type
    const eventType = request.headers['x-github-event'];
    if (!eventType) {
      // errors handling
    }
    // Parse request body
    const payload = await await getRequestBody(request);
    // Process based on event type
    let result;
    switch (eventType) {
      case 'ping':
        result = { status: 'success', message: 'Pong! Webhook configured successfully' };
        break;
      case 'push':
        result = handlePushEvent(payload);
        break;
      case 'pull_request':
        result = handlePullRequestEvent(payload);
        break;
      case 'issues':
        result = handleIssueEvent(payload);
        break;
      default:
        result = { 
          status: 'received', 
          message: `Received ${eventType} event, but no handler implemented` 
        };
    }
    
    //.stringify(result), {
      status: 200,
      headers: {
        'Content-Type': 'application/json'
      }
    });
  } catch (error) {
    // errors handling
  }
}

文件上传和处理服务

在无服务器函数中构建高性能文件上传功能,适用于多种媒体类型,包括图像、视频和文档。利用 Multer 和 Busboy 编排复杂的上传流解析。无缝集成领先的云存储平台,包括腾讯云 COS、AWS S3 和阿里云 OSS,提供弹性持久化存储解决方案。

探索这个实现,展示通过我们的 Node Functions 架构实现无缝用户文件上传与腾讯云 COS 直接集成。

// COS Configuration (simplified)
const cos = new COS({...});

const MAX_FILE_SIZE = 100 * 1024 * 1024;

function generateSafeFilename(originalFilename, mimeType) {
	...
}

async function uploadToCOS(fileData, filename, mimeType) {
  // Tencent Cloud COS upload logic...
}

export async function onRequest(context) {
  const req = context.request;

  try {
    return new Promise((resolve, reject) => { req.headers });
      const uploadResults = [];
      
      // Process file fields
      bb.on('file', (fieldname, file, { filename, mimeType }) => {
        const chunks = [];
        let fileSize = 0;
        
        file.on('data', (data) => {
          chunks.push(data);
          fileSize += data.length;
          
          if (fileSize > MAX_FILE_SIZE) {
            file.resume(); // Stop receiving
          }
        });

        file.on('end', async () => {
          if (fileSize > MAX_FILE_SIZE) {
            return; // Skip oversized files
          }
          
          try {
            // Process and upload file
            const fileData = Buffer.concat(chunks);
            const safeFilename = generateSafeFilename(filename, mimeType);
            const result = await uploadToCOS(fileData, safeFilename, mimeType);
            
            uploadResults.push({
              fieldname,
              ...result
            });
          } catch (err) {
            console.error('Upload error:', err);
          }
        });
      });

      bb.on('finish', () => {
        resolve(new Response(JSON.files: uploadResults
        }), { status: 200 }));
      });

      req.pipe(bb);
    });
  } catch (error) {
    return new Response(JSON.stringify({ error: 'Upload failed' }), { status: 500 });
  }
}

图像和视频处理引擎

在无服务器函数中充分利用行业领先的图像处理库,Sharp 和 Jimp 编排复杂的视觉转换,包括精确缩放、智能裁剪、动态水印、无缝格式转换和自适应质量压缩。通过 FFmpeg 和 Fluent-ffmpeg 集成部署先进的视频处理能力,实现专业级视频编辑工作流、高性能转码管道、智能帧提取和自动缩略图生成系统。

以下示例展示 Node Functions 架构接收处理 base64 图像。

export async function onRequest(context) {
  const { request } = context;

  try {
    const requestBody = await getRequestBody(request);
    
    let base64Data = requestBody.image;
    if (base64Data.includes(';base64,')) {
      base64Data = base64Data.split(';base64,')[1];
    }
    
    const imageBuffer = Buffer.from(base64Data, 'base64');
    
    // Get watermark parameters
    const watermarkText = requestBody.text || 'Watermark Example';
    const opacity = parseFloat(requestBody.opacity || '0.5');
    const textColor = requestBody.textColor || 'white';
    const fontSize = parseInt(requestBody.fontSize || '36', 10);
    
    const imageInfo = await sharp(imageBuffer).metadata();
    const imageMimeType = `image/${imageInfo.format}`;
    
    const processedImageBuffer = await addTextWatermark(
      imageBuffer,
      watermarkText,
      opacity,
      textColor,
      fontSize
    );
    
    // Return processed image
    return new Response(processedImageBuffer, {
      status: 200,
      headers: { 'Content-Type': imageMimeType }
    });
  } catch (error) {
    // errors handling
  }
}

服务端推送

在函数内构建实时通信能力,通过 Server-Sent Events (SSE) 实现单向数据流推送,或通过集成 WebSocket 网关服务实现双向实时通信。

利用消息队列(如 Redis Pub/Sub、Kafka、RabbitMQ)作为中介,Node Functions 可以订阅和推送实时数据,包括股票报价、体育比分、订单状态和系统监控。支持长轮询机制以满足兼容性要求,通过函数链调用实现数据过滤、聚合和转换,用于流处理。

以下是演示 SSE 服务器端功能实现的代码示例。

const clients = new Set();

// 模拟消息队列
const messageQueue = {
  subscribers: {},
  publish: function(channel, message) {
    ...
  },
  subscribe: function(channel, callback) {
    ...
  }
};

// 模拟股票数据生成器
function generateStockData() {
  ...
}

// 启动模拟数据发布
let stockDataInterval;() {
	// 每 2 秒发送数据
	...
}

// 停止模拟数据发布() {
  if (stockDataInterval && clients.size === 0) {
    clearInterval(stockDataInterval);
    stockDataInterval = null;
  }
}

export async function onRequest(context) {
  const { request, env } = context;
  
  const url = new URL(request.url, 'http://www.example.com');
  const channel = url.searchParams.get('channel') || 'stocks';
  
  const responseStream = new TransformStream();
  const writer = responseStream.writable.getWriter();
  
  // 设置 SSE 响应头
  .readable, {
    headers: {
      'Content-Type': 'text/event-stream',
      'Cache-Control': 'no-cache',
      'Connection': 'keep-alive',
    }
  });
  
  // 创建客户端对象
  const clientId = Date.now().toString();
  const client = {
    id: clientId,
    writer
  };
  
  // 将客户端添加到连接集合
  clients.add(client);
  
  if (clients.size === 1) {
    startStockDataSimulation();
  }
  
  // 发送连接成功消息
  const connectMessage = `event: connected\ndata: {"clientId":"${clientId}","message":"连接成功"}\n\n`;
  await writer.write(new TextEncoder().encode(connectMessage));
  
  // 订阅消息队列
  const unsubscribe = messageQueue.subscribe(channel, async (data) => {
    const eventData = `event: message\ndata: ${JSON.stringify(data)}\n\n`;
    await writer.write(new TextEncoder().encode(eventData));
  });
  
  // 监听连接关闭
  context.waitUntil(
    (async () => {
      try {
        await request.signal.aborted;
      } catch (error) {
        // 错误处理
      } finally {
        // 清理资源
      }
    })()
  );
  
  return response;
}

使用此客户端实现验证您的实时通信基础设施,确保连接测试无缝进行。

总结

Node Functions 代表了现代 Web 开发的重大突破。基于先进的无服务器架构,开发团队彻底摆脱了传统基础设施的束缚——无需服务器配置、自动弹性扩展、智能负载均衡,让开发者专注于核心业务逻辑和产品创新。

从轻量级 API 微服务到 AI 模型集成,从数据持久化到实时事件处理,从智能文件管理到多媒体处理管道,Node Functions 的应用场景覆盖了现代应用开发的方方面面。

无论是个人开发者的创新项目、初创企业的快速迭代,还是大型企业的关键业务系统,Node Functions 都提供了从原型验证到生产部署的完整解决方案,真正实现了"一次编写,无缝部署,弹性扩展"的开发理想。