【问题标题】:how can i get Json output from Sqlite3如何从 Sqlite3 获取 Json 输出
【发布时间】:2021-01-19 15:59:49
【问题描述】:

您好,我编写了一个用于从 2 个表中获取信息的 SQL,但是当我想返回数据时,我不知道索引是否可以在正确的时间执行。我应该怎么做,无论如何要从第一个而不是每个方法获得 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}%`, `%${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], (err, 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], [Object], [Object] ]   },   {
    id: 1995,
    antibodyName: 'Antibody 1995',
    colors: [ [Object], [Object], [Object], [Object], [Object] ]   },   {
    id: 1994,
    antibodyName: 'Antibody 1994',
    colors: [ [Object], [Object], [Object], [Object], [Object] ]   },   {
    id: 1993,
    antibodyName: 'Antibody 1998',
    colors: [ [Object], [Object], [Object], [Object], [Object] ]   },   {
    id: 1997,
    antibodyName: 'Antibody 1997',   } ]

【问题讨论】:

    标签: typescript sqlite node-sqlite3


    【解决方案1】:

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

    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], (err, colors: Color[]) => {
            if (err) {
              reject(err.message)
            } else {
              resolve(colors);
            }
          });
        });
      });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-05
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 2017-12-03
      相关资源
      最近更新 更多