要从AWS Lambda创建复杂的参数驱动查询吗?

问题描述

寻找// HERE IS THE PROBLEM PART句子以查找有问题的代码。

我正在尝试使用AWS Lambda(连接到RDS Postgres服务器)作为数据源来实现AppSync。我想创建一个puKnowledgeFile查询,该查询将使用可选参数更新我的KnowledgeFile。如果客户端仅提供htmlTextproperties作为参数,那么我的update查询应仅更新这两个字段。

type Mutation {
    putKnowledgeFile(
        id: ID!,htmlText: String,plainText: String,properties: AWSJSON
    ): KnowledgeFile
}

type KnowledgeFile {
    id: ID!
    htmlText: String!
    plainText: String!
    properties: AWSJSON!
    lastDateTimeModified: AWSDateTime!
    dateTimeCreated: AWSDateTime!
}

这是一段AWS Lambda代码:

exports.handler = async (event,context,callback) => {
  
  /* Connecting to Postgres */

  let data = null;
  let query = ``;
  let values = [];
  
  switch (event.info.fieldName) {
    case "putKnowledgeFile":
      if(event.arguments.htmlText === undefined &&
         event.arguments.plainText === undefined &&
         event.arguments.properties === undefined) {
        callback(`At least one argument except id should be provided in putKnowledgeFile request`);
      }

      // HERE IS THE PROBLEM PART
      query += `update knowledge_file`

      query += `
      set `;
      
      let index = 0;
      for (let fieldName in event.arguments) {
        if(arguments.hasOwnProperty(fieldName)) {
          const fieldValue = event.arguments[fieldName];
    
          if(index === 0) {
            query += `${fieldName}=$${index+1}`
            values.push(fieldValue);
          } else {
            query += `,${fieldName}=$${index+1}`
            values.push(fieldValue);
          }
    
          index++;
        }
      }

      query += `
where knowledge_file.id = $${index+1};`;
      values.push(event.arguments.id);
      // HERE IS THE PROBLEM PART

        break;
    default:
      callback(`There is no functionality to process this field: ${event.info.fieldName}`);
      return;
  }
  
  let res = null;
  try {
    res = await client.query(query,values); // just sending created query
  } catch(error) {
    console.log("@client.query");
    console.log(error);
  }

  /* DisConnecting from Postgres */

  callback(null,res.rows);

};

基本上,此算法通过多个字符串串联创建我的查询字符串。我认为它太复杂且容易出错。 有没有一种方法可以轻松地根据某些参数的存在/不存在来创建动态查询?

以防万一,这是我的PostgreSQL模式:

-- main client object for clients
CREATE TABLE client (
  id bigserial primary key,full_name varchar(255)
);

-- knowledge_file
create table knowledge_file (
  id bigserial primary key,html_text text,plain_text text,properties jsonb,last_date_modified timestamptz,date_created timestamptz,word_count varchar(50)
);

-- which client holds which knowledge file
create TABLE client_knowledge_file (
  id bigserial primary key,client_id bigint not null references client(id),knowledge_file_id bigint not null references knowledge_file(id) unique ON DELETE CASCADE
);

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)