ExpressJS +智威汤逊 什么是validation数据的正确方法?

我们来看一个例子。 我会跳过一些部分,如import,出口。

我有一个名为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:

 function getMyBooks(successCallback) { db.query('SELECT * FROM book b WHERE b.id_user=?', [Auth.getLoggedUID()], function(rows) { successCallback(rows); }); } 

我的问题是关于Auth.getLoggedUID函数。 假设我有一个JWTauthentication,并假设我有一个在有效载荷中的UID(甚至可以接受?),检索它的最佳select是什么? 有没有,除了每次都需要传递每个需要身份validation数据的函数?

我可能有一个函数内部的函数执行,我是否需要通过这两个req来获取用户ID? 喜欢这个?:

 function getBooks(req) { getMyBooks(req); getCriminalBooks(req); getEvenOtherBooksByAuthor(req, authorId); } 

老实说,我不喜欢那样。 也许我的整个概念是错误的,我应该做不同的事情? 有人能在这样的场景中指出正确的方向吗?

您可以在标题中传递UID并在控制器中检索它,如下所示:

 var uid =req.header('UID'); 

然后通过这个UID在任何你想要的地方都不需要结转整个req对象。

您可以使用中间件function。 让我们说,每一个命中你的端点的请求,将有一个令牌,你应该检查,并可能解码它。 之后,您可以将解码的内容设置为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; });