让我们跳到一个例子。我会跳过一些部分,比如进口,出口。
我有一个名为controllers / book.js的控制器,有一条路线:
router.get('/my-books', function(req, res) {
if(Auth.authenticated(req,res)) {
Book.getMyBooks(function(rows) {
response.operationSucceed(req, res, rows);
});
}
});
然后,在名为models / book.js的模型中,我有这个功能:
function getMyBooks(successCallback) {
db.query('SELECT * FROM book b WHERE b.id_user=?', [Auth.getLoggedUID()], function(rows) {
successCallback(rows);
});
}
我的问题是关于Auth.getLoggedUID函数。
假设我有JWT身份验证并假设我在有效负载中有UID(甚至可以接受?),那么检索它的最佳选择是什么?有没有,除了每次都将req
传递给我需要auth数据的每个函数?
我可能在函数内部执行函数,是否需要通过req
通过这两者来获取用户ID?像这样?:
function getBooks(req) {
getMyBooks(req);
getCriminalBooks(req);
getEvenOtherBooksByAuthor(req, authorId);
}
老实说,我不会那样。 也许我的整个概念都是错的,我应该采取不同的做法? 在这样的场景中,有人能指出正确的方向吗?
答案 0 :(得分:1)
您可以在标头中传递UID并在控制器内检索它:
/Desktop/python_work/test_name_function.py", line 1, in <module>
import unittest
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/unittest/__init__.py", line 58, in <module>
from .result import TestResult
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/unittest/result.py", line 5, in <module>
import traceback
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/traceback.py", line 3, in <module>
import linecache
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/linecache.py", line 10, in <module>
import tokenize
File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/tokenize.py", line 96, in <module>
class TokenInfo(collections.namedtuple('TokenInfo', 'type string start end line')):
AttributeError: 'module' object has no attribute 'namedtuple'
然后将这个UID传递到任何你想要的地方,无需随处携带整个req对象。
答案 1 :(得分:1)
您可以使用中间件功能。假设每次点击你的端点的请求都有一个你应该检查并可能解码它的令牌。之后,您可以将解码内容设置为req对象。所以像这样:
app.use(function(req, res, next) {
// get the token from the request headers most likely.
// verify and decode the token
// set the decoded content to the request
var payload = ..
req.payload = payload;
});
在此之后,您可以访问您拥有的每个端点中的有效负载。例如,在某些控制器中,您可以这样做:
app.get('/hey', function(req, res) {
var payload = req.payload;
});