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