本地测试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必填错误
解决办法
配置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文件路径,确保路径正确
- 安装
验证环境变量是否正确注入
- 在
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文件路径或变量名拼写。
- 在
修正模块加载阶段的依赖问题
- 当前代码在模块加载时就实例化
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()获取实例,而非在模块顶部直接实例化。
- 当前代码在模块加载时就实例化
检查变量名一致性
- 确保
.env文件中的变量名与代码中使用的COGNITO_USER_POOL、COGNITO_USER_CLIENT完全一致,注意大小写敏感。
- 确保
内容的提问来源于stack exchange,提问作者MaxxABillion
相关产品推荐
相关产品推荐

