我如何从Sqlite3中获取Json输出

问题描述

你好,我写了一条sql来从2个表中获取信息,但是当我想返回数据时,我不知道索引在正确的时机执行。我应该怎么做,有什么方法可以从第一种方法而不是每种方法中得到Json响应?

我的功能

const searchAntibodies = (
  index: number,amount: number,information: string,startDate: string,endDate: string,) => {
  return new Promise<Antibodies[]>((resolve,reject) => {
    let antibodies: Antibodies[] = [];
    db.serialize(() => {
      db.each(`SELECT id,name as antibodyName FROM Antibodies WHERE
              id IN 
              (SELECT id FROM Antibodies WHERE name LIKE ?
              UNION all
              SELECT antiId FROM AssignedColors WHERE name LIKE ?
              UNION all
              SELECT antiId FROM AssignedReactivities WHERE name LIKE ?)
              AND dateOfCreation >= ? AND dateOfCreation <= ?
              ORDER BY dateOfCreation DESC LIMIT ? OFFSET ?;`,[`%${information}%`,`%${information}%`,startDate,endDate,amount,index],(err,antibody: Antibodies) => {
          if (err) {
            reject(err.message);
          } else {
            db.all('SELECT name,locations,colorId FROM AssignedColors WHERE antiId = ?',[antibody.id],colors) => {
              if (err) {
                reject(err.message);
              } else {
                antibody.colors = colors;
                antibodies.push(antibody);
                if (antibodies.length === 10) {
                  resolve(antibodies)
                }
              }
            });
          }
        });
    });
  });
}

我的预期结果:

[   {
    id: 1999,antibodyName: 'Antibody 1999',colors: [ [Object],[Object],[Object] ]   },{
    id: 1995,antibodyName: 'Antibody 1995',{
    id: 1994,antibodyName: 'Antibody 1994',{
    id: 1993,antibodyName: 'Antibody 1998',{
    id: 1997,antibodyName: 'Antibody 1997',} ]

解决方法

经过大量搜索后确定找到答案。实际上,如果您没有为第一个回调函数设置类型,则可以在完成时获得第二个回调函数。 这是我的结果:

const getAntibodies = (
  index: number,amount: number,startDate: number,endDate: number,orderBy: string,orderType: string,) => {
  return new Promise<Antibodies[]>((resolve,reject) => {
    let antibodies: Antibodies[] = [];
    let totalCount: number;
    let sql = 'SELECT id,name as antibodyName,dateOfCreation FROM Antibodies ';
    let params = [amount,index];
    if (startDate !== 0 || endDate !== 0) {
      sql += `WHERE dateOfCreation >= ? AND dateOfCreation <= ? 
                ORDER BY ${orderBy} ${orderType} LIMIT ? OFFSET ?;`;
      params.unshift(startDate,endDate);
    } else {
      sql += `ORDER BY ${orderBy} ${orderType} LIMIT ? OFFSET ?;`;
    }
    db.serialize(() => {
      db.each(sql,params,async (err,antibody) => {
          if (err) {
            reject(err.message);
          } else {
            await getColors(antibody.id).then((colors) => {
              antibody.colors = colors;
              antibodies.push(antibody);
              if (antibodies.length === totalCount) {
                resolve(antibodies);
              }
            }).catch((err) => {
              reject(err);
            });
          }
        },(err,count) => {
          if (err) {
            reject(err.message)
          } else {
            if (count === 0) {
              resolve(antibodies);
            } else {
              totalCount = count;
            }
          }
        });
    });
  });
}

const getColors = (id: number) => {
  return new Promise<Color[]>((resolve,reject) => {
    db.serialize(() => {
      db.all('SELECT name,locations,colorId FROM AssignedColors WHERE antiId = ?',[id],colors: Color[]) => {
        if (err) {
          reject(err.message)
        } else {
          resolve(colors);
        }
      });
    });
  });
}