Javascript 如何在几乎整个postgresql数据库中查询每个项目的属性?(使用sequelize和Node.js)

Javascript 如何在几乎整个postgresql数据库中查询每个项目的属性?(使用sequelize和Node.js),javascript,node.js,postgresql,recursion,sequelize.js,Javascript,Node.js,Postgresql,Recursion,Sequelize.js,我试图扫描数据库中的整个树,查找每个项的两个属性(“title”和“id”),然后我需要检查当前表下面是否有链接的数据库表,如果是,我需要对该表执行相同的操作 一旦我得到了整个树,我需要将它们插入到主变量中,然后在我的web应用程序中导入到其他地方 (我非常确定我正在重新发明轮子。我已经搜索了Sequelize文档,但是如果有简单的解决方案,我没有看到。) 下面是我当前代码的相关部分(它还没有完全工作,但应该给出了想法) () ``` const buildTopicTreeFromCurren

我试图扫描数据库中的整个树,查找每个项的两个属性(“title”和“id”),然后我需要检查当前表下面是否有链接的数据库表,如果是,我需要对该表执行相同的操作

一旦我得到了整个树,我需要将它们插入到主变量中,然后在我的web应用程序中导入到其他地方

(我非常确定我正在重新发明轮子。我已经搜索了Sequelize文档,但是如果有简单的解决方案,我没有看到。)

下面是我当前代码的相关部分(它还没有完全工作,但应该给出了想法)

()

```

const buildTopicTreeFromCurrentDatabase=(回调)=>{
设topicTree=[];
让isFinished=false;
const isSearchFinished=新发射器();
log(`emitter created`);
isSearchFinished.on('finished',()=>{
log(`search is done`);
如果(isFinished=true){
回调(null,this.primaryTopicsShort)
};
});
/*需要返回并重构--请参阅*/
this.primaryTopicsShort=[];
PrimaryTopic.all()
.然后((主要主题)=>{
if(primaryTopics.length==0){
返回回调(“未定义主主题”);
}
for(设i=0;i{
如果(currentPrimaryTopic.secondaryTopics.length!==0){
for(设j=0;j{
如果(currentPrimaryTopic.secondaryTopics.length-1==j){
isSearchFinished.emit('finished');
}
如果(currentSecondaryTopic.thirdTopics.length!==0){
for(设k=0;k{
if(currentThirdTopics.fourthTopics.length!==0){
for(设l=0;l{
如果(currentFourthTopics.fifthTopics.length!==0){
for(设m=0;m{
回调(err);
});
}
}
})
.catch((错误)=>{
回调(错误)
});
}
}
})
.catch((错误)=>{
回调(err);
})
}
}
})
.catch((错误)=>{
回调(err);
})
}
})
.catch((错误)=>{
回调(err);
});
};
这段代码有一些问题

首先,我需要使用干式递归解决方案,因为数据库结构将来可能会发生变化

第二,我对“finished”发射器做了很多研究,但我还没有弄清楚如何放置它,以便在搜索数据库结束时发出事件,同时也不会在数据库中循环多次

我一直在研究下面的递归解决方案,但时间一直在延长,我觉得我没有取得任何进展

const buildDatabaseNames = (DatabaseNameStr, callback) => {
  let camelSingular = DatabaseNameStr.slice(0,1);
  camelSingular = camelSingular.toLowerCase();
  camelSingular = camelSingular + DatabaseNameStr.slice(1, DatabaseNameStr.length);
  let camelPlural = DatabaseNameStr.slice(0,1);
  camelPlural = camelPlural.toLowerCase();
  camelPlural = camelPlural + DatabaseNameStr.slice(1, DatabaseNameStr.length) + 's';
  let databaseNameStr = `{ "capsSingular": ${"\"" + DatabaseNameStr + "\""}, "capsPlural": ${"\"" + DatabaseNameStr + 's' + "\""}, "camelSingular": ${"\"" + camelSingular + "\""}, "camelPlural": ${"\"" + camelPlural + "\""} }`;
  let names = JSON.parse(databaseNameStr);
  return callback(names);
};

const isAnotherDatabase = (DatabaseName, id, NextDatabaseName) => {
  DatabaseName.findById({
    where: {
      id: id
    }
  })
  .then((res) => {
    if (typeof res.NextDatabaseName === undefined) {
      return false;
    } else if (res.NextDatabaseName.length === 0) {
      return false;
    } else {
      return true;
    }
  })
  .catch((err) => {
    console.error(err);
    process.exit();
  });
};

const searchDatabase = (first, i, current, next, list, callback) => {
  if (typeof first === 'string') {
    first = buildDatabaseNames(first);
    current = buildDatabaseNames(current);
    next = buildDatabaseNames(next);
  }
  if (first === current) {
    this.first = current;
    let topicTree = [];
    const isSearchFinished = new Emitter();
    console.log(`emitter created`);
    isSearchFinished.on('finished', () => {
      console.log(`the search is done`);
      callback(null, this.primaryTopicsShort);
    });
  }
  current.CapsSingular.all()
  .then((res) => {
    current.camelPlural = res;
    if (if current.camelPlural.length !== 0) {
      for (let j = 0; j < currentParsed.camelPlural.length; j++) {
        if (first === current) {
          this.first[i].current[j].title = current.camelPlural[j].title,
          this.first[i].current[j].id = current.camelPlural[j].id
          next.camelSingular = []
        } else {
          this.first[i]..current[j].title = current.camelPlural[j].title,
          this.first[i].id = current.camelPlural[j].id,
          next.camelSingular = []
        }
        let isNext = isAnotherDatabase(current.)
        searchDatabase(null, j, next, list[i + 1], list, callback).bind(this);
      }
    } else {
      callback(null, this.first);
    }
  })
  .catch((err) => {
    callback(err);
  });
};
constbuilddatabasenames=(DatabaseNameStr,callback)=>{
设camelsignal=DatabaseNameStr.slice(0,1);
单数骆驼
const buildDatabaseNames = (DatabaseNameStr, callback) => {
  let camelSingular = DatabaseNameStr.slice(0,1);
  camelSingular = camelSingular.toLowerCase();
  camelSingular = camelSingular + DatabaseNameStr.slice(1, DatabaseNameStr.length);
  let camelPlural = DatabaseNameStr.slice(0,1);
  camelPlural = camelPlural.toLowerCase();
  camelPlural = camelPlural + DatabaseNameStr.slice(1, DatabaseNameStr.length) + 's';
  let databaseNameStr = `{ "capsSingular": ${"\"" + DatabaseNameStr + "\""}, "capsPlural": ${"\"" + DatabaseNameStr + 's' + "\""}, "camelSingular": ${"\"" + camelSingular + "\""}, "camelPlural": ${"\"" + camelPlural + "\""} }`;
  let names = JSON.parse(databaseNameStr);
  return callback(names);
};

const isAnotherDatabase = (DatabaseName, id, NextDatabaseName) => {
  DatabaseName.findById({
    where: {
      id: id
    }
  })
  .then((res) => {
    if (typeof res.NextDatabaseName === undefined) {
      return false;
    } else if (res.NextDatabaseName.length === 0) {
      return false;
    } else {
      return true;
    }
  })
  .catch((err) => {
    console.error(err);
    process.exit();
  });
};

const searchDatabase = (first, i, current, next, list, callback) => {
  if (typeof first === 'string') {
    first = buildDatabaseNames(first);
    current = buildDatabaseNames(current);
    next = buildDatabaseNames(next);
  }
  if (first === current) {
    this.first = current;
    let topicTree = [];
    const isSearchFinished = new Emitter();
    console.log(`emitter created`);
    isSearchFinished.on('finished', () => {
      console.log(`the search is done`);
      callback(null, this.primaryTopicsShort);
    });
  }
  current.CapsSingular.all()
  .then((res) => {
    current.camelPlural = res;
    if (if current.camelPlural.length !== 0) {
      for (let j = 0; j < currentParsed.camelPlural.length; j++) {
        if (first === current) {
          this.first[i].current[j].title = current.camelPlural[j].title,
          this.first[i].current[j].id = current.camelPlural[j].id
          next.camelSingular = []
        } else {
          this.first[i]..current[j].title = current.camelPlural[j].title,
          this.first[i].id = current.camelPlural[j].id,
          next.camelSingular = []
        }
        let isNext = isAnotherDatabase(current.)
        searchDatabase(null, j, next, list[i + 1], list, callback).bind(this);
      }
    } else {
      callback(null, this.first);
    }
  })
  .catch((err) => {
    callback(err);
  });
};
const buildTopicTreeFromCurrentDatabase = (callback) => {
  let topicTree = [];
  const isSearchFinished = new Emitter();
  isSearchFinished.on('finished', () => {
    if (isFinished === 0) {
      callback(null, this.primaryTopicsShort);
    };
  });
  /* need to go back and refactor -- violates DRY */
  this.primaryTopicsShort = [];
  let isFinished = 0;
  isFinished = isFinished++;
  PrimaryTopic.all()
  .then((primaryTopics) => {
    isFinished = isFinished + primaryTopics.length;
    if (primaryTopics.length === 0) {
      return callback('no Primary Topics defined');
    }
    for (let i = 0; i < primaryTopics.length; i++) {
      if (i === 0) {
        var isLastPrimary = false;
      };
      this.primaryTopicsShort[i] = {
        title: primaryTopics[i].title,
        id: primaryTopics[i].id,
        secondaryTopics: []
      };
      PrimaryTopic.findById(this.primaryTopicsShort[i].id, {
        include: [{
          model: SecondaryTopic,
          as: 'secondaryTopics'
        }]
      })
      .then((currentPrimaryTopic) => {
        isFinished = isFinished - 1 + currentPrimaryTopic.secondaryTopics.length;
        if (i === primaryTopics.length - 1) {
          isLastPrimary = true;
        };
        if (currentPrimaryTopic.secondaryTopics.length === 0 && isLastPrimary) {
          isSearchFinished.emit('finished');
        } else if (currentPrimaryTopic.secondaryTopics.length !== 0) {
          for (let j = 0; j < currentPrimaryTopic.secondaryTopics.length; j++) {
            if (j === 0) {
              var isLastSecondary = false;
            }
            this.primaryTopicsShort[i].secondaryTopics[j] = {
              title: currentPrimaryTopic.secondaryTopics[j].title,
              id: currentPrimaryTopic.secondaryTopics[j].id,
              thirdTopics: []
            };
            SecondaryTopic.findById(this.primaryTopicsShort[i].secondaryTopics[j].id, {
              include: [{
                model: ThirdTopic,
                as: 'thirdTopics'
              }]
            })
            .then((currentSecondaryTopic) => {
              isFinished = isFinished - 1 + currentSecondaryTopic.thirdTopics.length;
              if (j === currentPrimaryTopic.secondaryTopics.length - 1) {
                isLastSecondary = true;
              }
              if (currentSecondaryTopic.thirdTopics.length === 0 && isLastPrimary && isLastSecondary) {
                isSearchFinished.emit('finished');
              } else if (currentSecondaryTopic.thirdTopics.length !== 0) {
                for (let k = 0; k < currentSecondaryTopic.thirdTopics.length; k++) {
                  if (k === 0) {
                    var isLastThird = false;
                  };
                  this.primaryTopicsShort[i].secondaryTopics[j].thirdTopics[k] = {
                    title: currentSecondaryTopic.thirdTopics[k].title,
                    id: currentSecondaryTopic.thirdTopics[k].id,
                    fourthTopics: []
                  };
                  ThirdTopic.findById(this.primaryTopicsShort[i].secondaryTopics[j].thirdTopics[k].id, {
                    include: [{
                      model: FourthTopic,
                      as: 'fourthTopics'
                    }]
                  })
                  .then((currentThirdTopic) => {
                    isFinished = isFinished - 1 + currentThirdTopic.fourthTopics.length;
                    if (k === currentSecondaryTopic.thirdTopics.length - 1) {
                      isLastThird = true;
                    };
                    if (currentThirdTopic.fourthTopics.length === 0 && isLastPrimary && isLastSecondary && isLastThird) {
                      isSearchFinished.emit('finished');
                    } else if (currentThirdTopic.fourthTopics.length !== 0) {
                      for (let l = 0; l < currentThirdTopic.fourthTopics.length; l++) {
                        if (l = 0) {
                          var isLastFourth = false;
                        }
                        this.primaryTopicsShort[i].secondaryTopics[j].thirdTopics[k].fourthTopics[k] = {
                          title: currentThirdTopic.fourthTopics[l].title,
                          id: currentThirdTopic.fourthTopics[l].id,
                          fifthTopics: []
                        }
                        FourthTopic.findById(this.primaryTopicsShort[i].secondaryTopics[j].thirdTopics[k].fourthTopics[l].id, {
                          include: [{
                            model: FifthTopic,
                            as: 'fifthTopics'
                          }]
                        })
                        .then((currentFourthTopics) => {
                          isFinished = isFinished - 1 + currentFourthTopics.fifthTopics.length;
                          if (l = currentThirdTopic.fourthTopics.length - 1) {
                            isLastFourth = true;
                          }
                          if (currentFourthTopic.fifthTopics.length === 0 && isLastPrimary && isLastSecondary && isLastThird && isLastFourth) {
                            isSearchFinished.emit('finished');
                          } else if (currentFourthTopic.fifthTopics.length !== 0) {
                            for (let m = 0; m < currentFourthTopic.fifthTopics.length; m++) {
                              if (m = 0) {
                                var isLastFifth = false;
                              }
                              if (m === currentFourthTopic.fifthTopics.length - 1) {
                                isLastFifth = true;
                              }
                              this.primaryTopicsShort[i].secondaryTopics[j].thirdTopics[k].fourthTopics[k].fifthTopics[m] = {
                                title: currentFourthTopic.fifthTopics[m].title,
                                id: currentFourthTopic.fifthTopics[m].id
                              };
                              if (isLastPrimary === true && isLastSecondary === true && isLastThird === true && isLastFourth === true && isLastFifth === true) {
                                isFinished = isFinished - 1;
                                isSearchFinished.emit('finished');
                              };
                            }
                          }
                        })
                        .catch((err) => {
                          callback(err);
                        });
                      }
                    }
                  })
                  .catch((err) => {
                    callback(err)
                  });
                }
              }
            })
            .catch((err) => {
              callback(err);
            })
          }
        }
      })
      .catch((err) => {
        callback(err);
      });
    }
  })
  .catch((err) => {
    callback(err);
  });
};