Когда я определяю свои маршруты в node.js, я пытаюсь вызвать некоторое промежуточное программное обеспечение для загрузки пользователей в зависимости от запроса. Однако асинхронный характер вытаскивания пользователей из базы данных, по-видимому, делает невозможным.Асинхронные обратные вызовы невозможны nesting
Middleware, который использует другую функцию для подключения к базе данных
function loadUsers (req, res, next) {
userings.openPlayers(function(ps) {
req.user = ps[req.params.id - 1];
});
console.log(req.user);
}
маршрут, который использует промежуточное программное
app.get('/player/game/:id', loadUsers, function(res, req) {
console.log(req.user);
});
Функция, которая подключается к БД и возвращает пользователям обратного вызова
function openPlayers(callback) {
db.hgetall("players", function(err, objs) {
var players = [];
// Objects of Response
for (var k in objs) {
// Items are the individual key-value object
var newPlayer = {};
var items = JSON.parse(objs[k]);
for (var x in items) {
// x is the key for each object
newPlayer[x] = items[x];
}
players.push(newPlayer);
}
callback(players);
});
}
module.exports.openPlayers = openPlayers;
Функция подключения к базе данных отлично работает! Моя конкретная проблема заключается в том, как использовать обратный вызов, чтобы вернуть пользователей функции loadUsers
, чтобы мой маршрут мог использовать ее в качестве промежуточного программного обеспечения. Спасибо!
Вы хотите вызвать ':
Было бы, вероятно, будет лучше держать
Object
, используя свои ключи как:id
и просто преобразование значения из JSON вObject
себя S next() 'из обратного вызова. – Bergi'req.user' по-прежнему возвращается как' undefined' с маршрута. –
Я проверил подтвержденное, что оно возвращает ожидаемое значение. Я немного озадачен этим вопросом после нескольких часов отладки. –