2

我是 javascript 新手,直接进入 node.js。我已经阅读了很多理论,并且从实用方面开始(我正在为移动应用程序编写 API),但是我有一个基本问题,这导致我使用中间件。我已经成功实现了一个中间件功能,但是我想知道我给出的中间件想法的使用是否可以,并且也解决了最初将我带到中间件的问题。我的问题有两个,如下:

1)据我所知,使用中间件的想法是在实际处理请求之前重复一个过程。我用它来验证令牌,如下:我的只有一个url没有收到令牌参数,所以

应用程序.js

app.get('/settings', auth.validateToken, auth.settings);

auth.js

function validateToken(req, res, next){ //code };

在 validateToken 中,我的代码检查令牌,如果一切正常,则调用 next(),或者将 res 修改为 json 以返回特定的错误代码。
我对此的问题是:a)这是对中间件的正确使用吗?b) 是否有 [正确] 将值传递给下一个函数的方法?不是仅在一切正常的情况下才调用 next ,是否有一种 [正确的] 方法可以调用 next 任何一种方式,并从 next 函数(无论它是什么)内部知道中间件是否成功?如果有,这是否是对中间件的正确使用?这一点让我想到了我原来的问题,以及这个问题的第二部分,即封装函数:

这部分已修复,请参阅我的第二条评论
2) 我发现中间件试图简单地封装 validateToken,并且能够从 get 处理程序指向的函数内部调用它,例如 auth.settings。我习惯于常见的顺序编程,而不是使用 javascript,考虑到 node.js 的基于事件的性质,我一生都无法理解如何做到这一点。
我现在要做的是编写一个简单地验证用户和密码的函数。我把它完美地写在一个特定的处理程序中,但正要复制粘贴到另一个处理程序,所以我停了下来。我想从头开始以正确的方式做事,并了解 node.js。我遇到的一个具体问题是,当用户和密码不匹配时我必须返回的错误代码因父函数而异,所以我需要这个函数才能告诉回调函数“嘿,密码和用户不匹配”,所以我可以从父函数中回复正确的消息。
我真正想要的是编写一个可以从另一个内部调用的异步函数。

我希望我已经很清楚了,我一直在尝试自己解决这个问题,但是我无法完全理解我的实际问题是什么,我猜这是由于我最近对 ​​node.js 的介绍。 jsjs。提前致谢!詹妮弗。

4

2 回答 2

2

1) 有 res.locals 对象 ( http://expressjs.com/api.html#res.locals ) 旨在存储请求本地的数据并将它们从一个中间件传递到另一个中间件。处理请求后,此对象将被处置。如果要在会话中存储数据,可以使用 req.session。

2)如果我理解你的问题,你想要一个函数将响应异步传递给调用者。您可以按照大多数节点功能的设计方式来执行此操作。

您以这种方式定义一个函数:

function doSomething(parameters, callback) {
    // ... do something

    // if (errorConddition()) err = errorCode();

    if (callback) callback(err, result)
}

并且调用者不使用函数的返回值,而是将回调传递给该函数:

function caller(req, res, next) {
   //... 

   doSomething(params, function(err, result) {

       if (! err && result) {
           // do something with the result
           next();
       } else {
           // do something else

           next();

           // or even res.redirect('/error');
       }
   });

}

如果您发现自己编写了类似的回调函数,您应该将它们定义为函数并将函数作为参数传递:

//...

doSomething(param, processIt);

function processIt(err, result) {
   // ...
}

让您感到困惑的可能是您还没有将函数视为值,这是 JavaScript 特有的(不包括很少使用的语言)。

于 2013-03-16T17:08:45.163 回答
1

在 validateToken 中,我的代码检查令牌,如果一切正常,则调用 next(),或者将 res 修改为 json 以返回特定的错误代码。

a) 这是对中间件的正确使用吗?b) 是否有 [正确] 将值传递给下一个函数的方法?

是的,这是使用中间件的正确方法,尽管根据响应消息类型和规范,您可以使用 connect 的内置错误处理。在本例中,通过调用 next({status:401,stack:'Unauthorized'}); 生成 401 状态码。

中间件系统旨在通过一系列函数处理请求,直到一个函数回复请求。这就是为什么下一个函数只接受一个参数是错误的

-> 如果将错误对象传递给下一个函数,则它将用于创建响应,并且不会处理进一步的中间件。创建错误响应的方式如下

    // default to 500
    if (res.statusCode < 400) res.statusCode = 500;
    debug('default %s', res.statusCode);

    // respect err.status
    if (err.status) res.statusCode = err.status;

    // production gets a basic error message
    var msg = 'production' == env
      ? http.STATUS_CODES[res.statusCode]
      : err.stack || err.toString();

-> 将值传递到修改请求对象的中间件堆栈是最好的方法。这确保了所有处理都绑定到该特定请求,并且由于请求对象通过每个中间件函数,因此这是将信息向下传递到堆栈的好方法。

于 2013-03-15T06:03:19.600 回答