Ошибка при использовании Request-Promise с Falcor

Я пытаюсь выполнить вызов Falcor GET для внешнего API, используя пакет Request-Promise (rp). Я получаю ответ в «res» (строка № 8), но не могу вернуть его в путь модели Falcor (строка № 13). Выдает ошибку "Uncaught (in promise)".

Кроме того, я попытался поместить оператор возврата (строка 13) внутри блока then (т.е.) после строки 8. Затем он выдал "GET http://localhost/getBusinessTypes... 500 (внутренняя ошибка сервера)".

1) router.get('/getBusinessTypes.json', falcorServer.dataSourceRoute(function (req, res) {
2)    return new falcorRouter([
3)        {
4)            route: "businessTypes.all",
5)            get: function() {
6)                rp('http://localhost:8000/service?method=getBusinessTypes')
7)                    .then(function (res) {
8)                        console.log("Response from external Api: " + res);
9)                    })
10)                    .catch(function (err) {
11)                        console.log(err);
12)                    });
13)                return {path: ["businessTypes", "all"], value: $atom(res)};
14)            }
15)        }
16)    ]);
17) }));

Дайте мне знать, чего здесь не хватает.


person Jimmy    schedule 21.09.2017    source источник


Ответы (1)


Попробуйте вернуть обещание из вызова rp():

router.get('/getBusinessTypes.json', falcorServer.dataSourceRoute(function (req, res) {
  return new falcorRouter([{
    route: "businessTypes.all",
    get: function() {
      return rp('http://localhost:8000/service?method=getBusinessTypes')
        .then(function (res) {
          console.log("Response from external Api: " + res)
          return {
            path: ["businessTypes", "all"],
            value: $atom(res)
          }
        })
        .catch(function (err) {
          console.log(err)
          // Handle error
        })
    }
  }])
}))

Вы можете использовать async/await следующим образом:

router.get('/getBusinessTypes.json', falcorServer.dataSourceRoute(function (req, res) {
  return new falcorRouter([{
    route: "businessTypes.all",
    get: async function() {

      try {
        let result = await rp('http://localhost:8000/service?method=getBusinessTypes')

        console.log("Response from external Api: " + result)
        return {
          path: ["businessTypes", "all"],
          value: $atom(result)
        }
      }
      catch(err) {
        console.log(err)
        // Handle error
      }

    })
  }])
}))
person Steve Holgado    schedule 21.09.2017
comment
Просто из любопытства использовать Async/Await — могу ли я использовать это в этом примере? Можете ли вы подсказать мне, как это сделать? - person Jimmy; 22.09.2017
comment
Я добавил к своему ответу версию async/await. Надеюсь, это поможет. - person Steve Holgado; 22.09.2017
comment
Да, это сработало и стало гораздо легче следовать. Спасибо за помощь. - person Jimmy; 25.09.2017