I am testing a serverless REST API offline. Sls offline starts fine, but when I send a POST request to create a new user I get the following error:
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.
UserPoolId
and ClientId
are declared in the .env file and my token_middleware is as follows:
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);
Here us 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,
});
});
};
I sent the following request via Postman
It should create the user and send a confirmation email with an API key. But instead I get a 502 Bad Gateway.
I have to reference the .env
file at the top of the user_handler.js
file.