node.js中间件和js封装

我是新来的JavaScript,并跳入node.js。 我已经阅读了很多理论,并且从实际的angular度出发(我正在为移动应用程序编写一个API),但是我有一个基本问题,这导致我转向了中间件。 我已经成功实现了一个中间件function,但是我想知道是否使用了中间件这个概念,并且还解决了把中间件带给我的原始问题。 我的问题是双重的,如下所示:

1)从我能收集到的信息来看,使用中间件的想法是在实际处理请求之前重复一个过程。 我用它来进行标记validation,如下所示:只有我的一个url没有收到一个标记参数,所以

app.js

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

auth.js

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

在validateToken中,我的代码检查标记,然后在一切正常的情况下调用next(),或者将res修改为json以返回特定的错误代码。
我的问题是:a)这是中间件的正确使用吗? b)是否有将值传递给下一个函数的正确方法? 而不是只有在一切正常的情况下才调用下一个函数,那么接下来哪种调用方法是正确的,并且从下一个函数(无论哪个函数)中知道中间件是否成功? 如果有的话,这将是一个适当的使用中间件? 这个精确的点使我想起了我原来的问题,这个问题的第二部分是封装函数:

这部分是固定的,看到我的第二个评论 。
2)我发现中间件试图简单地封装validateToken,并且能够从get处理程序指向的函数内部调用它,例如auth.settings。 我习惯于通用的顺序编程,而不是在JavaScript中,并没有为我的生活能够理解如何做到这一点,考虑到node.js基于事件的性质。
我现在要做的是编写一个简单的validation用户和密码的函数。 我把它完全写在一个特定的处理程序中,但正要复制粘贴到另一个,所以我停了下来。 我想从头开始做正确的事情,并理解node.js. 我一直遇到的一个具体问题是,当用户和密码不匹配时,必须返回的错误代码根据父函数而不同,所以我需要这个函数来告诉callback函数“嘿,密码和用户不匹配”,所以从父母function我可以回应正确的消息。
我真正想要的是写一个asynchronous函数,我可以从另一个内部调用。

我希望我已经清楚了,我一直在试图自己解决这个问题,但是我不能完全的理解我的实际问题,我猜这是因为我最近对节点的介绍。 JS JS。 提前致谢! 珍妮弗。

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

2)如果我理解你的问题,你需要一个函数asynchronous传递给调用者的响应。 你可以像大多数节点的function一样devise。

你用这种方式定义一个函数:

 function doSomething(parameters, callback) { // ... do something // if (errorConddition()) err = errorCode(); if (callback) callback(err, result) } 

而调用者而不是使用函数的返回值将callback传递给此函数:

 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'); } }); } 

如果你发现自己编写了类似的callback函数,你应该将它们定义为函数,只需要传递函数作为参数:

 //... doSomething(param, processIt); function processIt(err, result) { // ... } 

什么让你感到困惑,可能是,你不把function作为价值,这是一个非常具体的JavaScript(不包括很less使用的语言)。

在validateToken中,我的代码检查标记,然后在一切正常的情况下调用next(),或者将res修改为json以返回特定的错误代码。

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

是的,这是使用中间件的正确方法,尽pipe取决于响应消息types和规格,您可以使用内置的连接error handling。 在这个例子中,通过调用next({status:401,stack:'Unauthorized'})来生成401状态码。

中间件系统被devise为通过经历一系列function来处理请求,直到一个function应答请求。 这就是为什么下一个函数只有一个参数是错误的

– >如果一个错误对象被传递给下一个函数,那么它将被用来创build一个响应,并且不会有更多的中间件被处理。 错误响应的创build方式如下所示

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

– >将值传递给中间件堆栈修改请求对象是最好的方法。 这确保所有处理都绑定到特定的请求,并且由于请求对象遍历每个中间件function,所以将信息传递到堆栈是一种好方法。