Почему мой вызов apolloFetch возвращает пустой запрос при вызове из обещания. - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь использовать apolloFetch внутри Promise.all в микросервисе Node.js, но получаю сообщение об ошибке, что запрос пуст.Причина использования apolloFetch состоит в том, чтобы вызвать другой микро сервис и передать ему массив запросов.Может кто-нибудь дать мне какое-то направление?Мой код выглядит следующим образом:

   const uri = "dsc.xxx.yyyy.com/abc/def/graphql";
   const apolloFetch = CreateApolloFetch({uri});
  const QryAllBooks = {
    type: new GraphQLList(BookType),
    args: {},
    resolve() {
        return new Promise((resolve, reject) => {
            let sql = singleLineString`
                  select distinct t.bookid,t.bookname,t.country
                  from books_tbl t
                  where t.ship_status = 'Not Shipped'
              `;
            pool.query(sql, (err, results) => {
                if (err) {
                    reject(err);
                }
                resolve(results);
                const str = JSON.stringify(results);
                const json = JSON.parse(str);
                const promises = [];
                for (let p = 0; p < results.length; p++) {
                    const book_id = json[p].bookid;
                    const query = `mutation updateShipping
                              {updateShipping
                               (id: ${book_id}, input:{
                                  status: "Shipped"
                               })
                               { bookid
                                 bookname }}`;
                    promises.push(query);
                }
                //Below is the Promise.all function with the   
                //apolloFetch that calls another graphql endpoint
                //an array of queries
                Promise.all(promises.map(p => apolloFetch({p}))).then((result) => {
                    //this is the problem code^^^^^^^^^^^^^^^^^^^^^ 
                    resolve();
                    console.log("success!");
                }).catch((e) => {
                    FunctionLogError(29, "Error", e);
                });
            });
        });
    }
};
module.exports = {
    QryAllBooks,
    BookType
};

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Вы немедленно разрешаете или отклоняете, как только начинается обратный вызов pool.query():

if(err){ reject(err);}resolve(results);

Поэтому, если запрос не завершится неудачно, вы никогда не разрешите результаты, вызванные вызовами apolloFetch, так какОбещание уже выполнено с результатами pool.query ().Я полагаю, вам не хватает блока else:

if( err ) {
  reject();
}
else {
  const promises = ...
}

PS: вы можете попробовать использовать util.promisify () для node.js, чтобы превратить pool.query() в обещание, чтобы вы могли простонапишите что-нибудь похожее: query(...).then(results=>results.map(apolloFetch) вместо того, чтобы смешивать обратные вызовы и обещания.

0 голосов
/ 27 февраля 2019

Похоже, что apolloFetch требует query - вы передаете p

, измените

Promise.all( promises.map(p=>apolloFetch({p})) )

на

Promise.all( promises.map(query=>apolloFetch({query})) )

Вы также дважды вызываете функцию разрешения

Для устранения всех ошибок или успеха

const final_results = []
Promise.all(promises.map(query => apolloFetch({
  query,
}))).then((result) => {
  final_results.push(result)
}).catch((e) => {
  final_results.push(e)
}).then(() => {
  resolve(final_results)
});
...