首页 > 解决方案 > 在 Node 中检查付款状态的有效方法?

问题描述

检查用户是否支付订阅的最佳方法是什么?我想检查用户是否支付了每月订阅,如果没有,我会将他重定向到支付页面。

我的解决方案

使用 JWT:每当用户登录时,我都会将next_payment_date(从数据库中检查)写入 jwt 并对其进行签名。所以每次用户向受保护的路由(只能为付费用户访问的路由)发出请求时,我都会解码令牌并检查next_payment_date并采取相应的行动

这种方法的问题:假设用户正在使用手机和电脑。在电脑上,他收到付款过期通知,他付款成功。但是后来当他使用手机时,他的手机不会更新**jsonwebtoken**,这将使他重定向到付款页面(这不是一个好兆头)

解决方案2:

始终从数据库检查付款状态。

问题是:每次请求来时,都要查询数据库,这是无用的读取操作。

如果您知道处理此问题的任何更好/有效的方法,请建议我

标签: node.jsdatabasemongodbmongoosepayment-processing

解决方案


第三种解决方案是使用一些内存服务,例如 Redis。
内存服务将按原样(在内存中)存储数据,并且 CRUD 操作将比数据库操作快得多。

所以,解决方案是:

始终检查付款状态

但是存储在redis中。

在这种情况下,您需要在操作时更新用户的付款状态。
您可以将用户付款状态保存为布尔值并在付款时更新。
要删除付款状态,您可以使用EXPIRE键(在付款步骤中设置它们),redis 将从内存中删除用户付款。
如果您的应用程序非常大,并且您想变得非常高效,请在此处此处阅读有关 EXPIRE 的更多信息,并选择它是否对您有用。

注意:另外,在 JWT 的情况下,用户可以更改它,所以如果你完全信任 JWT,用户可以欺骗你。您可以在此处 阅读 JWT 可能存在的更多问题

[更新]:
关于评论中提到的 MongoDB。
正如您在解决方案 2 中所说的“......这是无用的读取操作。”,您的案例数据库中的每个有状态服务都是有状态的。
这意味着它必须将数据保存在某处。对于此任务,数据库使用磁盘。
不管是 SQL 还是 NoSQL 数据库,它都必须从磁盘读取/写入数据。意味着它需要额外的时间和资源。
另一方面,内存服务将数据存储在内存中,这意味着代码不需要去数据库,要求在磁盘上查找数据,等待db在磁盘上找到数据然后返回给用户。
内存存储只是在内存中查找数据,速度非常快。您可以在此处阅读更多信息。

底线,内存存储比任何数据库都快。
但是,与往常一样,解决方案取决于您的任务。
如果您需要创建测试服务,或者您将每秒处理大约 100 个请求,那么有状态数据库就足够了。
但是,如果您需要加快代码速度或处理更多负载,最好使用内存存储。


推荐阅读