2017-08-20 27 views
5

w moim programie robię async wezwanie do mojej funkcji z innego modułu API:Właściwa prośba o async/czekają node.js

var info = await api.MyRequest(value); 

kod Moduł:

var request = require("request") 

module.exports.MyRequest = async function MyRequest(value) { 
    var options = { 
     uri: "http://some_url", 
     method: "GET", 
     qs: { // Query string like ?key=value&... 
      key : value 
     }, 
     json: true 
    } 

    try { 
     var result = await request(options); 
     return result; 
    } catch (err) { 
     console.error(err); 
    } 
} 

Wykonanie natychmiast powraca jednak result, a zatem info zawiera obiekt żądania i treść żądania - info.body, taki jak key=value&..., niezbędny korpus odpowiedzi.

Co robię źle? Jak naprawić? Co to jest poprawne korzystanie z request z async lub działa poprawnie tylko z obietnicami, o których tu mowa: Why await is not working for node request module? Poniższy artykuł jest możliwy: Mastering Async Await in Node.js.

+0

'' await' async' i praca w nodejs 7 najnowszy build. więc upewnij się, że masz najnowszą wersję nodejs 7. Aby uzyskać więcej informacji, możesz polecić ten link https://blog.risingstack.com/async-await-node-js-7-nightly – Aabid

+0

@Aabid Mam Node.js 8.4 –

Odpowiedz

11

Należy użyć modułu request-promise, a nie modułu request.

await prace nad funkcjami, które zwracają obietnicę, a nie na funkcje, które zwracają obiekt request i oczekiwać na użycie zwrotnych lub detektory zdarzeń, aby wiedzieć, kiedy rzeczy są zrobione.

Moduł request-promise obsługuje te same funkcje co moduł request, ale asynchroniczne funkcje w niej powrócić obietnic więc można użyć .then() lub await z nich zamiast wywołania zwrotne, że moduł request spodziewa.

Więc zainstalować request-promise module a następnie zmienić:

var request = require("request"); 

do tego:

var request = require("request-promise"); 
0

Dość, że można również wykonać następujące czynności. Jeśli to, czego potrzebujesz, nie zwraca domyślnie obietnicy, możesz ją przekazać za pomocą nowej metody obietnicy. Powyższa odpowiedź jest jednak mniej szczegółowa.

async function getBody(url) { 
 
    const options = { 
 
    url: url, 
 
    method: 'GET', 
 
    }; 
 

 
    // Return new promise 
 
    return new Promise(function(resolve, reject) { 
 
    // Do async job 
 
    request.get(options, function(err, resp, body) { 
 
     if (err) { 
 
     reject(err); 
 
     } else { 
 
     resolve(body); 
 
     } 
 
    }) 
 
    }) 
 
}

Powiązane problemy