Node.js 如果dynamodb中不存在项,则无法返回数组

Node.js 如果dynamodb中不存在项,则无法返回数组,node.js,amazon-dynamodb,Node.js,Amazon Dynamodb,我有一个函数,它将一个作业数组作为参数。此函数将通过其id检查数据库中是否存在每个作业 如果某个作业不在数据库中,则需要将该特定作业推送到名为latestJobs的数组中。我在我的main.js文件中调用这个函数。但代码中断并停止 下面是我的main.js代码: module.exports.app = async () => { try { ... const jobs = await getJobsForCountries(body); const lates

我有一个函数,它将一个
作业数组
作为参数。此函数将通过其
id
检查数据库中是否存在每个
作业

如果某个作业不在数据库中,则需要将该特定作业推送到名为
latestJobs
的数组中。我在我的
main.js
文件中调用这个函数。但代码中断并停止

下面是我的main.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
  }
};
我的checker函数如下所示:

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;
};


如何解决此问题我想要数据库中不存在的
最新作业
。dynamodb有没有一个函数可以帮我做到这一点?

你混合了回调、承诺和等待的风格。我会这样做

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;
};


另外,请确保创建了表,并且您传递的区域和名称是正确的。

我对
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:我还在中进行错误处理。

再次检查
process.env.DYNAMODB_表
值。@hoangdv是的,它有一个有效的value@preethiR ??? :D我不这么认为,我认为您的系统上没有任何名为is
process.env.DYNAMODB_table
的表
dynamoDb.get
如果id值为
job.id的项存在或不存在,则始终返回success。在未找到的情况下,您可以检查
data.Item===null
。我已经按照您的建议更改了代码。但是控制流从不进入
if(!result)
块。相反,它进入了捕捉区。我发现了。我刚刚移动了
最新作业。将(作业)
推到
.catch
块中。“现在它开始起作用了。”亚什瓦尔德汉波拉尼克很高兴它起作用了。顺便问一下,您在catch中遇到了什么错误?为什么不能编写clean和module函数来处理这个问题,上面的代码看起来unhealthy@YashwardhanPauranik这意味着
latestJobs.push(作业)始终被调用,尽管项目是否存在???上面的代码是模块化的,但当我拆分时,我必须运行2个循环,而不是一个。这样看,每次您尝试执行一些昂贵的操作和其他作业等待时,都要在一个循环中运行。为什么不在我们需要的参数循环上迭代呢?我们迭代的初始循环不会对性能产生影响。代码看起来干净整洁。更重要的是,它是人类可读的。如果找不到job,则catch块中不会有'job'实例。如果错误正确,并且param包含'id:job.id`right?变量
job
不在推送它的
getJobs()
中。因此将抛出错误。