Невозможно вернуть массив, если элемент не присутствует в DynamodB - PullRequest
3 голосов
/ 21 января 2020

У меня есть функция, которая будет принимать массив jobs в качестве параметра. Эта функция будет проверять наличие каждого job в базе данных через id.

Если задание не представлено в базе данных, это конкретное задание необходимо поместить в массив с именем latestJobs. Я вызываю эту функцию в моем файле main.js. Но код ломается и останавливается.

Ниже мой основной. js код:

module.exports.app = async () => {
 try {
    ...
    const jobs = await getJobsForCountries(body);
    const latestJobs = await filterPreDraftedJobs(jobs);
    console.log('latestJobs', latestJobs);

  } catch (e) {
    console.error('Error:- ', e); // Comes to here
  }
};

Моя функция проверки выглядит так:

module.exports = async (jobs) => {
  let latestJobs = [];
  for (const job of jobs) {
    const params = {
      TableName: process.env.DYNAMODB_TABLE,
      Key: {
        id: job.Id
      }
    };
    await dynamoDb.get(params, (err, data) => {
      if (err) {
        latestJobs.push(job);
        console.log('Job not found in DB'); 
      }
    }).promise();
  }
  return latestJobs;
};

enter image description here

Как я могу решить эту проблему? Я хочу latestJobs, который не будет представлен в базе данных. Есть ли функция для DynamodB, которая может сделать это для меня?

Ответы [ 2 ]

1 голос
/ 21 января 2020

Вы смешиваете обратный вызов, обещание и стиль ожидания. Я бы сделал это так

module.exports = async (jobs) => {
  let latestJobs = [];
  for (const job of jobs) {
    const params = {
      TableName: process.env.DYNAMODB_TABLE,
      Key: {
        id: job.Id
      }
    };
    try {
      const result = await dynamoDb.get(params).promise();
      if (result) {
       return; 
      }
    } catch(err) {
      latestJobs.push(job);
    }
  }
  return latestJobs;
};

Также убедитесь, что таблица создана, а регион и имя, которое вы передаете, верны.

0 голосов
/ 22 января 2020

Я не очень знаком с dynamoDB, но, глядя на приведенный выше код разговора, должно быть что-то вроде этого. Я пытался улучшить производительность и убедиться, что код является модульным и читаемым.

async function addUpdateJobs(jobs)
{
    let paramsArray = [];
    for (const job of jobs)
    {
        const jobParams = {
        params:{
            TableName: process.env.DYNAMODB_TABLE,
            Key: {
                id: job.Id
            }               
        },
         job:job
    };
        paramsArray.push(jobParams );

    }
    return await this.getJobs(paramsArray);
}


function getJobs(paramsArray)
{
    let latestJobs = [];
    paramsArray.each(async (jobParam)=>
    {
        try
        {
            const result = await dynamoDb.get(jobParam.params).promise();
            if (result)
            {
                return;
            }
        } catch (err)
        {
            latestJobs.push(jobParam.job);
        }
    });
    return latestJobs;

}

PS: Я также был уверен в обработке ошибок в amazondynamodb .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...