TypeOrm Query Builder 动态自动删除功能与 cron 作业不工作
TypeOrm QueryBuilder dynamic auto delete function with crons job not working
用于电子邮件验证的令牌是通过用户注册创建的,需要在 24 小时内使用 cron 作业帮助从数据库中删除。在使用查询构建器的删除函数中,仅当以字符串形式手动提供日期值时才会删除令牌:{delDate: "2021-02-08T17:59:48.485Z" }。在这里,所有日期在 2021-02-08 之前或等于 2021-02-08 的令牌都被删除,并且工作正常。但那是静态输入,手动输入硬代码!
由于这必须是一个动态输入,我设置了变量 'delTime',其中存储当前日期减去 24 小时,但似乎 .where 条件不会将变量作为值,也不会删除,因为:{ delDate: deltime}.事实上,'delDate' 控制台正是我需要的信息,但它只能以字符串形式工作。
在 typeorm querybuilder 中有大量内容在线教授如何删除具有静态值的内容,但是很难找到具有动态值的内容....
我还能如何以动态方式完成这项工作?
async delete(req: Request, res: Response){
try {
const tokenRepository = getRepository(Token);
var delTime = new Date();
delTime.setDate( delTime.getDate() - 1 );
console.log(delTime) //consoles 24 hors ago
await tokenRepository
.createQueryBuilder()
.delete()
.from(Token)
.where("tokenDate <= :deleteTime", { deleteTime: delTime})//value dynamically stored in variable does not delete
//.where("tokenDate <= :deleteTime", { deleteTime: "2021-02-08T18:01:10.489Z"})//static hard code value deletes
//.where("tokenDate <= :delTime", { delTime})//Variable put this way will not work either...
.execute();
} catch (error) {
res.status(404).send("Tokens not found");
return;
}
res.status(200).send('Tokens deleted successfuly');
}
您的参数化查询看起来是正确的。
打开TypeOrm Query Logging查看生成的SQL,也许你就能看出问题所在。将生成的 SQL 粘贴到 SQL 查询控制台进行调试。
或者,您可以编写不带参数的删除查询,让 Sqlite 计算当前日期 -1 天:
.where("tokenDate <= DateTime('Now', '-1 Day'"); // for Sqlite
注意 1:Sqlite DateTime('Now') 使用 UTC 时间,因此您的 tokenDate 也应使用 UTC。
注2:这个语法是Sqlite特有的,你可以在其他数据库中做同样的事情,但语法不同,例如微软 SQL 服务器:
.where("tokenDate <= DATEADD(day, -1, SYSUTCDATETIME()); // for MS SQL Server
用于电子邮件验证的令牌是通过用户注册创建的,需要在 24 小时内使用 cron 作业帮助从数据库中删除。在使用查询构建器的删除函数中,仅当以字符串形式手动提供日期值时才会删除令牌:{delDate: "2021-02-08T17:59:48.485Z" }。在这里,所有日期在 2021-02-08 之前或等于 2021-02-08 的令牌都被删除,并且工作正常。但那是静态输入,手动输入硬代码! 由于这必须是一个动态输入,我设置了变量 'delTime',其中存储当前日期减去 24 小时,但似乎 .where 条件不会将变量作为值,也不会删除,因为:{ delDate: deltime}.事实上,'delDate' 控制台正是我需要的信息,但它只能以字符串形式工作。 在 typeorm querybuilder 中有大量内容在线教授如何删除具有静态值的内容,但是很难找到具有动态值的内容.... 我还能如何以动态方式完成这项工作?
async delete(req: Request, res: Response){
try {
const tokenRepository = getRepository(Token);
var delTime = new Date();
delTime.setDate( delTime.getDate() - 1 );
console.log(delTime) //consoles 24 hors ago
await tokenRepository
.createQueryBuilder()
.delete()
.from(Token)
.where("tokenDate <= :deleteTime", { deleteTime: delTime})//value dynamically stored in variable does not delete
//.where("tokenDate <= :deleteTime", { deleteTime: "2021-02-08T18:01:10.489Z"})//static hard code value deletes
//.where("tokenDate <= :delTime", { delTime})//Variable put this way will not work either...
.execute();
} catch (error) {
res.status(404).send("Tokens not found");
return;
}
res.status(200).send('Tokens deleted successfuly');
}
您的参数化查询看起来是正确的。
打开TypeOrm Query Logging查看生成的SQL,也许你就能看出问题所在。将生成的 SQL 粘贴到 SQL 查询控制台进行调试。
或者,您可以编写不带参数的删除查询,让 Sqlite 计算当前日期 -1 天:
.where("tokenDate <= DateTime('Now', '-1 Day'"); // for Sqlite
注意 1:Sqlite DateTime('Now') 使用 UTC 时间,因此您的 tokenDate 也应使用 UTC。
注2:这个语法是Sqlite特有的,你可以在其他数据库中做同样的事情,但语法不同,例如微软 SQL 服务器:
.where("tokenDate <= DATEADD(day, -1, SYSUTCDATETIME()); // for MS SQL Server