Search code examples
javascriptpostmanaws-api-gatewayamazon-cognitoserverless

Sls offline POST test receives Error: Both UserPoolId and ClientId are required and 502 Bad Gateway


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 ClientIdare 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 Postmanenter image description here

It should create the user and send a confirmation email with an API key. But instead I get a 502 Bad Gateway.


Solution

  • I have to reference the .env file at the top of the user_handler.js file.