You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

本地测试Serverless API遇错误:需UserPoolId和ClientId且返回502

本地测试Serverless REST API创建用户时出现UserPoolId和ClientId必填错误

问题描述

本地用sls offline启动Serverless REST API正常,但发送POST请求创建新用户时返回502 Bad Gateway,后台报错如下:

POST /prod/users (λ: createUser)
Unhandled exception in handler 'createUser'.
Error: Both UserPoolId and ClientId are required.
      at new CognitoUserPool (/node_modules/amazon-cognito-identity-js/lib/CognitoUserPool.js:45:13)
      at Object.<anonymous> (/middlewares/token_middleware.js:11:18)
      at Module._compile (node:internal/modules/cjs/loader:1112:14)
      at Module._extensions..js (node:internal/modules/cjs/loader:1166:10)
      at Module.load (node:internal/modules/cjs/loader:988:32)
      at Module._load (node:internal/modules/cjs/loader:834:12)
      at Module.require (node:internal/modules/cjs/loader:1012:19)
      at require (node:internal/modules/cjs/helpers:102:18)
      at Object.<anonymous> (/handlers/users_handler.js:8:21)
      at Module._compile (node:internal/modules/cjs/loader:1112:14)
Both UserPoolId and ClientId are required.

已在.env文件中声明UserPoolId和ClientId,但报错依然存在。

相关代码

token_middleware.js

const jwt = require("jsonwebtoken"),
  request = require("request"),
  jwkToPem = require("jwk-to-pem"),
  AmazonCognitoIdentity = require("amazon-cognito-identity-js");

const poolData = {
  UserPoolId: process.env.COGNITO_USER_POOL,
  ClientId: process.env.COGNITO_USER_CLIENT,
};
const pool_region = process.env.COGNITO_REGION;
const userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);

users_handler.js

"use strict";
const Database = require("../db"),
  User = require("../models/user.model"),
  Usage = require("../models/usage.model"),
  jwt = require("jsonwebtoken"),
  { v4: uuidv4 } = require("uuid"),
  emailService = require("../services/mail.service"),
  tokenMiddleware = require("../middlewares/token_middleware"),
  subWeeks = require("date-fns/subWeeks"),
  querystring = require("querystring"),
  AWS = require("aws-sdk"),
  AmazonCognitoIdentity = require("amazon-cognito-identity-js");

const poolData = {
  UserPoolId: process.env.COGNITO_USER_POOL,
  ClientId: process.env.COGNITO_USER_CLIENT,
};
const pool_region = process.env.COGNITO_REGION;
const userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);

/* Create User */
module.exports.create = (event, context, callback) => {
  context.callbackWaitsForEmptyEventLoop = false;
  Database.connectToDatabase()
    .then(() => {
      let body = URLSearchParams.decode(event.body);
      const randomKey = uuidv4();
      let newUser = new User({
        firstName: body.firstName,
        lastName: body.lastName,
        email: body.email,
        password: body.password,
        apiKey: randomKey.replace(/-/g, ""),
      });
      newUser.save(function (err, user) {
        if (err) {
          callback(null, {
            statusCode: err.statusCode || 500,
            headers: { "Content-Type": "text/plain" },
            body: err.message,
          });
        } else {
          callback(null, {
            statusCode: 200,
            body: JSON.stringify(user),
          });
        }
      });
    })
    .catch((err) => {
      callback(null, {
        statusCode: err.statusCode || 500,
        headers: { "Content-Type": "text/plain" },
        body: err.message,
      });
    });
};

请求情况

通过Postman发送POST请求到/prod/users,请求体为x-www-form-urlencoded格式,包含firstName、lastName、email、password字段。

预期与实际结果

预期:创建用户并发送包含API key的确认邮件
实际:返回502 Bad Gateway,后台出现上述UserPoolId和ClientId必填错误


解决办法

  1. 配置Serverless Offline加载环境变量

    • 安装serverless-dotenv-plugin插件:
      npm install serverless-dotenv-plugin --save-dev
      
    • 在serverless.yml中添加插件配置:
      plugins:
        - serverless-dotenv-plugin
        - serverless-offline
      custom:
        dotenv:
          path: .env # 指定.env文件路径,确保路径正确
      
  2. 验证环境变量是否正确注入

    • 在token_middleware.js开头添加日志打印,确认变量是否存在:
      console.log("COGNITO_USER_POOL:", process.env.COGNITO_USER_POOL);
      console.log("COGNITO_USER_CLIENT:", process.env.COGNITO_USER_CLIENT);
      
    • 重启sls offline查看控制台输出,若变量为空,检查.env文件路径或变量名拼写。
  3. 修正模块加载阶段的依赖问题

    • 当前代码在模块加载时就实例化CognitoUserPool,若环境变量未及时加载会报错。可延迟实例化逻辑:
      // 修改token_middleware.js
      let userPool;
      function getUserPool() {
        if (!userPool) {
          const poolData = {
            UserPoolId: process.env.COGNITO_USER_POOL,
            ClientId: process.env.COGNITO_USER_CLIENT,
          };
          userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);
        }
        return userPool;
      }
      module.exports = { getUserPool };
      
    • 在users_handler.js中通过调用getUserPool()获取实例,而非在模块顶部直接实例化。
  4. 检查变量名一致性

    • 确保.env文件中的变量名与代码中使用的COGNITO_USER_POOL、COGNITO_USER_CLIENT完全一致,注意大小写敏感。

内容的提问来源于stack exchange,提问作者MaxxABillion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 08:15:27