làm cách nào để lấy đầu ra Json từ Sqlite3
Oct 05 2020
Xin chào, tôi đã viết một SQL để lấy thông tin từ 2 bảng nhưng khi tôi muốn trả lại dữ liệu, tôi không biết chỉ mục để thực hiện nó vào đúng thời điểm. tôi nên làm gì và có cách nào để nhận được phản hồi Json từ lần đầu tiên thay vì từng phương pháp không?
chức năng của tôi:
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)
}
}
});
}
});
});
});
}
kết quả mong đợi của tôi:
[ {
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', } ]
Trả lời
MjEbrahimzadeh Oct 06 2020 at 02:09
Ok sau khi tìm kiếm rất nhiều đã tìm ra câu trả lời. Trên thực tế, nếu bạn không đặt loại cho hàm gọi lại đầu tiên, bạn có thể nhận được hàm gọi lại thứ hai khi nó hoàn thành. Đây là kết quả của tôi:
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);
}
});
});
});
}