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我不这么认为,我认为您的系统上没有任何名为isprocess.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()
中。因此将抛出错误。