clarkie/dynogels

No return from getAsync...

Opened this issue · 6 comments

I am using dynogels-promisified (so please let me know if this should be in another repo) and I have the below snippet in an async function but for some reason it is not returning from dynogels...

try {
		const result = await PEPPOLCountryList.getAsync(getParams);
		if (!result)
			return Promise.reject(new Error(
				'PEPPOL Country list lookup returned "null", ' +
				JSON.stringify(getParams)
		));
		clientContext.peppol.snd.schemeID = result.get('schemeID');
	} catch (err) {
		return Promise.reject(err);
	}

I am running in in AWS Lambda Node.js v8.10 and the Lambda always times out waiting for the return...

dynogels.AWS.config is set and verified with AccessKey/Secret and region.

Using "dynogels-promisified@^1.0.4" and "dynogels@^9.0.0".

export const PEPPOLCountryList = dynogels.define('PEPPOLCountryList', {
  tableName: 'qip-' + process.env.LAMBDA_STAGE + '-peppol-country-list',
  hashKey: 'countryCd',
  rangeKey: 'peppolCd',
  schema: {
    countryCd: Joi.string(),
    peppolCd: Joi.string(),
    description: Joi.string(),
    schemeID: Joi.string()
  },
  validation: {
    // don't allow properties not defined in the schema!
    allowUnknown: false
  }
});

I get no error message and no logging that helps me track this done... Any pointers?

Thanks for a very useful package!

Does the same happen when using dynogels by itself?


Side note, this is an anti-pattern:

async function foo() {
  try {
    await bar();
  } catch (err) {
    return Promise.reject(err);
  }
}

A thrown exception in an async function is automatically converted into rejection. Just write:

async function foo() {
  await bar();
}

The try/catch boilerplate in your function is just adding noise and not doing anything useful.

+1 to this issue.
ran into the exact same situation

@ekf3119 With dynogels or dynogels-promisified?

@QAnders @ekf3119 Can either of you reproduce this with logging enabled and post a log?

@cdhowie I'm experiencing this issue as well. Here's what I was able to get from bunyan, although I'm having a little trouble configuring the proper loglevel:

{
    "name": "globalLogger",
    "hostname": "169.254.75.205",
    "pid": 1,
    "level": 30,
    "params": {
        "TableName": "functions-table",
        "Key": {
            "functionArn": "arn:aws:lambda:{redacted}"
        }
    },
    "msg": "dynogels GET request",
    "time": "2019-12-13T08:01:13.435Z",
    "v": 0
}
export const lookupPEPPOLCd = async (countryCd, searchScheme) => {
  try {
    const query = await PEPPOLCountryList.query(countryCd)
      .filter('schemeID')
      .contains(searchScheme)
      .execAsync()
      .then(reply => reply.Items.map(item => item.get()));
    return query[0].peppolCd;
  } catch (err) {
    return Promise.reject(err);
  }
};

Here's how I ended up coding it instead... Note the execAsync()!