2016-10-20 3 views
1

Я новичок в nodejs, это может показаться довольно тривиальным, но у меня возникают проблемы с извлечением данных из функции, которая возвращает обещание. Ответ от промежуточного программного обеспечения отправляется обратно на передний конец. Вот мой кодвозвращение данных в промежуточное ПО из обещания

// middleware 
app.get('/player', function(req, res) { 
      //data i want to return 
    res.send(getPlayerStats.getPlayerId(req.query.name))); 
}); 

//getPlayerStats.js 
var getPlayerId = function(name) { 
    return start(name) 
     .then(getPlayerInGame) 
     .then(getPlayerStats) 
     .then(getPlayers); 
    //.then(sendToSingular) 
} 

//getplayers function 
var getPlayers = function(data) { 
    return data; 
} 

Я посылаю данные неверным способом? Ответ, который я вижу на переднем конце, - это объект с прототипом как единственное свойство. Я могу распечатать данные в getPlayers(), и я вижу, что он работает нормально.

+0

Вы не можете назвать 'res.send' на асинхронные методы, которые возвращают результат в более позднее время, вы должны послать внутри обратного вызова для метода асинхронной – adeneo

ответ

3

Это потому, что вы передаете обещание в res.send.

res.send(/* You are passing a promise here */); 

Что вы должны сделать, это ждать, пока обещание разрешить с данными, а затем отправить эти данные:

getPlayerStats.getPlayerId(req.query.name).then(function(data) { 
    res.send(data); 
}); 
+0

Благодаря nem035! Я сделал это, и он работает! – inhaler

+0

@inhaler без проблем amigo, рад помочь. Вот некоторые полезные ресурсы ([этот] (http://stackoverflow.com/documentation/javascript/231/promises#t=201610202030578009337) и [этот] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)) для получения дополнительной информации о обещаниях – nem035

0

Когда вы пишете межплатформенное это звучит, как вы хотите, чтобы игрок идентификатор будет доступен для другие действия, поэтому в дополнение к другим комментарии здесь:

app.get('/player/*', function(req, res, next) { 
      //data i want to return 
    getPlayerStats.getPlayerId(req.query.name))).then(function(id){ 
     res.locals.playerId = id; 
     next(); 
    }); 
}); 


app.get('/player/action', function(req, res){ 
    res.send(res.locals.playerId); //or use it for further processing 
}); 
+0

Это было бы очень полезно, когда я начну работать с другими частями этого проекта. Большое спасибо!! – inhaler

1

И я всегда рекомендую, чтобы закончить свое обещание цепь с catch(), чтобы убедиться, что ошибки обрабатываются:

getPlayerStats.getPlayerId(req.query.name) 
    .then(function(data) { 
    res.send(data); 
    }) 
    .catch(function(error){ 
    res.status(500).send('Some error text'); 
    });