node.js - 在 Node 中检查付款状态的有效方法?
问题描述
检查用户是否支付订阅的最佳方法是什么?我想检查用户是否支付了每月订阅,如果没有,我会将他重定向到支付页面。
我的解决方案:
使用 JWT:每当用户登录时,我都会将next_payment_date
(从数据库中检查)写入 jwt 并对其进行签名。所以每次用户向受保护的路由(只能为付费用户访问的路由)发出请求时,我都会解码令牌并检查next_payment_date
并采取相应的行动
这种方法的问题:假设用户正在使用手机和电脑。在电脑上,他收到付款过期通知,他付款成功。但是后来当他使用手机时,他的手机不会更新**jsonwebtoken**
,这将使他重定向到付款页面(这不是一个好兆头)
解决方案2:
始终从数据库检查付款状态。
问题是:每次请求来时,都要查询数据库,这是无用的读取操作。
如果您知道处理此问题的任何更好/有效的方法,请建议我
解决方案
第三种解决方案是使用一些内存服务,例如 Redis。
内存服务将按原样(在内存中)存储数据,并且 CRUD 操作将比数据库操作快得多。
所以,解决方案是:
始终检查付款状态
但是存储在redis中。
在这种情况下,您需要在操作时更新用户的付款状态。
您可以将用户付款状态保存为布尔值并在付款时更新。
要删除付款状态,您可以使用EXPIRE键(在付款步骤中设置它们),redis 将从内存中删除用户付款。
如果您的应用程序非常大,并且您想变得非常高效,请在此处和此处阅读有关 EXPIRE 的更多信息,并选择它是否对您有用。
注意:另外,在 JWT 的情况下,用户可以更改它,所以如果你完全信任 JWT,用户可以欺骗你。您可以在此处
阅读 JWT 可能存在的更多问题
[更新]:
关于评论中提到的 MongoDB。
正如您在解决方案 2 中所说的“......这是无用的读取操作。”,您的案例数据库中的每个有状态服务都是有状态的。
这意味着它必须将数据保存在某处。对于此任务,数据库使用磁盘。
不管是 SQL 还是 NoSQL 数据库,它都必须从磁盘读取/写入数据。意味着它需要额外的时间和资源。
另一方面,内存服务将数据存储在内存中,这意味着代码不需要去数据库,要求在磁盘上查找数据,等待db在磁盘上找到数据然后返回给用户。
内存存储只是在内存中查找数据,速度非常快。您可以在此处阅读更多信息。
底线,内存存储比任何数据库都快。
但是,与往常一样,解决方案取决于您的任务。
如果您需要创建测试服务,或者您将每秒处理大约 100 个请求,那么有状态数据库就足够了。
但是,如果您需要加快代码速度或处理更多负载,最好使用内存存储。
推荐阅读
- xmlhttprequest - Laravel 访问 XMLHttpRequest 错误如何解决
- javascript - 使用正则表达式从字符串中提取重量和价格值
- firebase - 不能使用 firebase 引用数据类型来获取子集合
- css - Firefox 按钮删除 Firefox 77 中的填充
- python - 如何计算熊猫股票开盘价的百分比变化
- javascript - List.js - 按超过 1 个键/值/答案的属性过滤
- reactjs - 如何使用 Ionic React 从 IonTabBar 触发 IonModal
- csv - SSIS中的日期类型转换
- r - 试图在 R 中的 ggplot 图上获得更平滑的线
- python - 熊猫列组内所有可能的排列