0
我使用ExpressJS中間件來檢查數據庫中的用戶IP,並在最後一小時有超過7次失敗登錄時停止響應用戶,我在數據庫連接之前檢查'/'是否爲垃圾郵件數據庫如果一切正常。但事實證明,雖然中間件正在訪問數據庫並在回調中執行檢查,但第一個else
中的代碼仍在運行。這裏是我的中間件:回調阻止線程
// check for failed logins from this ip in db
// if allowed number exceeded - stop responding
app.use(function (req, res, next) {
if(req._parsedUrl.pathname === '/') {
MongoClient.connect(databaseUri || 'mongodb://localhost:27017/dev', function (err, db) {
assert.equal(err, null);
var failedLogins = db.collection('FailedLogins');
failedLogins.find({ip: req._remoteAddress}).toArray(function (err, results) {
assert.equal(err, null);
console.log('db check');
// if ip is in FailedLogins collection
if (results.length) {
// if there are more than 7 logins and they haven't expired
if (results[0].failedLoginsNum >= 7 && parseInt(results[0].expiration) >= parseInt(Date.now())) {
res.end();
} else {
next();
}
} else {
next();
}
});
});
} else {
console.log('next');
next();
}
});
這是控制檯輸出:
db check
GET/200 20.117 ms - -
next
GET /favicon.ico 200 207.559 ms - 1353
感謝,您的實現看起來那麼多比我好,我就用它作爲指導試圖解決的一塌糊塗我已經完成) – snowfinch27
歡迎您使用廣泛使用的身份驗證庫[passportJs](http://passportjs.org/),它支持許多Oauth策略,如Google,Facebook等。對於mongoDb,有一個[mongoose](http://mongoosejs.com/)庫,它有更多的功能,比如創建模式,預先保存鉤子等。 –
謝謝,絕對會檢查出來 – snowfinch27