node.js中间件和js封装

时间:2013-03-14 21:25:23

标签: node.js express middleware

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

1)从我可以收集的信息来看,使用中间件的想法是在实际处理请求之前重复一个过程。我已将其用于令牌验证,如下所示: 我的网址中只有一个没有收到令牌参数,所以

app.js

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

auth.js

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

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

此部分已修复,请MY SECOND COMMENT 2)我发现中间件试图简单地封装validateToken,并且能够从get处理程序指向的函数内部调用它,例如auth.settings。 我已经习惯了常见的顺序编程,而不是javascript,并且我的生活中没有能够理解如何做到这一点,同时考虑到node.js的基于事件的特性。
我现在想做的是编写一个简单验证用户和密码的函数。我把它完美地写在一个特定的处理程序中,但是要将它复制粘贴到另一个,所以我停了下来。我想从头开始以正确的方式做事,并了解node.js.其中一个具体的问题,我'已经一直有,是错误代码,我不得不返回时,用户名和密码唐'吨匹配取决于父功能是不同的,所以我需要这个功能能够告诉回调函数"嘿,密码和用户不匹配"所以从父函数我可以回复正确的消息。
我真正想要的是写一个我可以从另一个内部调用的异步函数。

我希望我' VE是明确的,我'一直在试图解决这个我自己,但我可以'吨颇为完成包装我在我的实际问题是什么头,我'由于我最近对node.js JS的介绍,我猜测它。 提前致谢!珍。

2 个答案:

答案 0 :(得分: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特有的(不包括很少使用的语言)。

答案 1 :(得分:1)

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

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

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

中间件系统旨在通过执行一系列功能来处理请求,直到一个函数回复请求。这就是下一个函数只接受一个错误

的参数的原因

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

    // 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();

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