2017-08-20 11 views
5

मेरे कार्यक्रम में में इंतजार है मैं एक और एपीआई मॉड्यूल से मेरी समारोह के लिए async फोन करना:उचित अनुरोध/Node.js

var info = await api.MyRequest(value); 

मॉड्यूल कोड:

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); 
    } 
} 

निष्पादन तुरंत वापस लौट , हालांकि result और इसलिए info में अनुरोध ऑब्जेक्ट और अनुरोध निकाय - info.body जैसे key=value&..., आवश्यक प्रतिक्रिया निकाय नहीं है।

मैं क्या गलत कर रहा हूं? कैसे ठीक करना है? उचित async के साथ उपयोग क्या है, या यह यहां उल्लिखित वादे के साथ सही ढंग से काम करता है: Why await is not working for node request module? निम्नलिखित लेख का उल्लेख किया गया है: Mastering Async Await in Node.js

+0

'async' और NodeJS में' await' काम 7 नवीनतम निर्माण। इसलिए कृपया सुनिश्चित करें कि आपके पास नोडजेस का नवीनतम निर्माण है 7. अधिक जानकारी के लिए आप इस लिंक को https://blog.risingstack.com/async-await-node-js-7-nightly – Aabid

+0

@Aabid मेरे पास Node.js 8.4 –

उत्तर

11

आपको request-promise मॉड्यूल का उपयोग करने की आवश्यकता है, न कि request मॉड्यूल।

awaitrequest ऑब्जेक्ट को वापस करने वाले कार्यों पर नहीं, और कॉलबैक या ईवेंट श्रोताओं को यह जानने के लिए कि जब चीजें पूरी की जाती हैं, तो उन कार्यों पर काम करता है जो वादे वापस करते हैं।

request-promise मॉड्यूल request मॉड्यूल के रूप में एक ही सुविधाओं का समर्थन करता है, लेकिन यह में अतुल्यकालिक कार्यों वादों लौट ताकि आप कॉलबैक कि request मॉड्यूल की उम्मीद करने के बजाय उन लोगों के साथ या तो .then() या await उपयोग कर सकते हैं।

तो, request-promise module इंस्टॉल करें और फिर इसे बदल:

var request = require("request"); 
इस के लिए

:

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

सुंदर यकीन है कि आप भी कर सकते हैं। यदि आपको जो चाहिए वह डिफ़ॉल्ट रूप से वादा वापस नहीं करता है तो आप इसे नए वादा विधि के माध्यम से प्रदान कर सकते हैं। उपरोक्त उत्तर हालांकि कम verbose है।

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); 
 
     } 
 
    }) 
 
    }) 
 
}

संबंधित मुद्दे