我是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的介绍,我猜测它。 提前致谢!珍。
答案 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;将值传递到中间件堆栈中修改请求对象是最好的方法。这确保了所有处理都绑定到该特定请求,并且由于请求对象遍历每个中间件函数,因此将信息传递到堆栈中是一种好方法。