3

我正在尝试在 Node.js 上为 Express 做一个非常简单的基本身份验证中间件,如下所示:http: //node-js.ru/3-writing-express-middleware

我有我的中间件功能:

var basicAuth = function(request, response, next) {
    if (request.headers.authorization && request.headers.authorization.search('Basic ') === 0) {
        // Get the username and password
        var requestHeader = new Buffer(
                request.headers.authorization.split(' ')[1], 'base64').toString();
        requestHeader = requestHeader.split(":");

        var username = requestHeader[0];
        var password = requestHeader[1];

        // This is an async that queries the database for the correct credentials
        authenticateUser(username, password, function(authenticated) {
            if (authenticated) {
                next();
            } else {
                response.send('Authentication required', 401);
            }
        });
    } else {
        response.send('Authentication required', 401);
    }
};

我有我的路线:

app.get('/user/', basicAuth, function(request, response) {
    response.writeHead(200);
    response.end('Okay');
});

如果我尝试卷曲这个请求,我会得到:

curl -X GET http://localhost/user/ --user user:password
Cannot GET /user/

当我在调用 createServer() 时添加中间件时,这非常酷,但是当我像在这条路线中一样按请求执行时,它只是在服务器端安静地死掉。不幸的是,由于并非所有请求都需要身份验证,因此我无法将其设为全局中间件。

我尝试关闭 Express 并仅使用 Connect 并得到相同的结果,所以我认为它在那里。以前有人经历过吗?

编辑:我还应该提到我已经详尽地记录了相关代码,并且正在调用下一个,但它似乎无处可去。

编辑 2:作为记录,“空”中间件也默默地失败:

var func = function(request, response, next) {
    next();
};

app.get('/user', func, function(request, response) {
    response.writeHead(200);
    response.end('Okay');
});

这也有同样的结果。

4

2 回答 2

0

function(request, response, callback) {

对比

next();

你应该要么改变callbacknext反之亦然。

于 2011-04-15T20:34:07.487 回答
0

我找到了这个链接。

Express 中间件:基本 HTTP 身份验证

作者似乎在做和你一样的事情,除了他在 next() 之后有一个返回。

于 2011-05-28T20:31:54.497 回答