Как вернуть переменную из запроса mon goose, он возвращает Promise {<pending>} - PullRequest
0 голосов
/ 04 февраля 2020

Я использую серверную программу, которая работает с mon go db, но я не могу вернуть переменную для использования в коде из запроса mon goose. Должно быть что-то не так с asyn c managem enet.

Я резюмировал, что я хочу сделать с очень простым кодом: я должен найти имя по идентификатору и использовать его.

Представьте, что у вас есть какая-то схема для Thing типа:

const ThingSchema = mongoose.Schema({
  _id: mongoose.Schema.Types.ObjectId,
  name: String
}

И в маршрутизаторе для URL-адреса у меня есть запрос на получение:

router.get('/:id', (req, res, next) => {
    const id = req.params.id;
    const name = findName(id);
    console.log(name);
    res.status(200).json({name: name});
});

Итак, я создал функцию для поиска имени

function findName(id){
  var name = Thing.findById(id)
               .exec()
               .then(docs =>{
                  var string = "the name is: " + docs.name;
                  return string
               });
  return name
}

Когда я отправляю запрос GET с действительным идентификатором, он дает мне:

В журнале: Promise {}

И obv в ответ: {"name": {}}

Я не дурак, я уже искал десятки топи c и официальных руководств и делал различные попытки, но я не понял, как это сделать.

(простите за плохой английский sh, я из Италии)

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Ваш exe c () вернет обещание. Используйте это обещание в своем обработчике маршрута.

Измените свой обработчик маршрута на:

router.get('/:id', (req, res, next) => { 
const id = req.params.id;
  findName(id)
     .then((res)=>{
 res.status(200).json({name: name}); 
})
.catch((err)=>{
res.status(500).send(err);
})
})

Или используйте asyn c, ожидайте как:

router.get('/:id', async(req, res, next) => { 
try{
const id = req.params.id;
const name= await findName(id);
res.status(200).json({name: name}); 
}
catch(err){
res.status(500).send(err);
}
})

Измените findName функция к:

function findName(id){ 
return Thing.findById(id).exec();
}
0 голосов
/ 04 февраля 2020

Ваш метод возвращает обещание, поэтому вам нужно ждать его следующим образом.

router.get('/:id', async(req, res, next) => {
    const id = req.params.id;
    const name = await findName(id);
    console.log(name);
    res.status(200).json({name: name});
});
...