comment puis-je obtenir la sortie Json de Sqlite3
Oct 05 2020
Bonjour, j'ai écrit un SQL pour obtenir des informations à partir de 2 tables mais lorsque je veux renvoyer les données, je ne connais pas l'index pour le faire au bon moment. que dois-je faire et y a-t-il de toute façon pour obtenir la réponse Json de la première méthode au lieu de chaque méthode?
ma fonction:
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)
}
}
});
}
});
});
});
}
mon résultat attendu:
[ {
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', } ]
Réponses
MjEbrahimzadeh Oct 06 2020 at 02:09
Ok après avoir beaucoup cherché a trouvé la réponse. En fait, si vous ne définissez pas de types pour la première fonction de rappel, vous pouvez obtenir une deuxième fonction de rappel lorsque celle-ci est terminée. Voici mon résultat:
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);
}
});
});
});
}