Использование asyn c -await с node-fetch не возвращает ответ на вызывающий метод - PullRequest
0 голосов
/ 22 марта 2020

У меня есть функция, определенная в модуле, которая должна делать выборку и возвращать ответ. У меня возникли проблемы с возвратом ответа из выборки. Вызывающая функция получает возвращаемое значение как «неопределенное».

Я новичок в JavaScript и Node, поэтому, возможно, вам понадобится немного подержать, если вы не возражаете.

Функция вызова

async function executeTest() {
    try {
        const response = await bpc.postLendingApplication(
            blendConnection,
            loanData
        );
        console.log("Response from POST Loan: ", response);
    } catch (error) {
        console.log(error);
    }
}

Функция модуля, выполняющая запрос на выборку

const fetch = require("node-fetch");
async function postLendingApplication(connection, data) {
    console.log("Processing POST Loan.");
    await fetch(connection.url, {
        method: "POST",
        headers: connection.headers,
        body: data,
    }).then(async res => {
        console.log("Status: ", res.status);
        console.log("StatusText: ", res.statusText);
        console.log("OK: ", res.ok);
        return await res;
    });
}

Выход консоли is:

Processing POST Loan.
Status:  200
StatusText:  OK
OK:  true
Response from POST Loan:  undefined

Как вы можете видеть, выборка сделала то, что должна была сделать, и если я зарегистрирую res. json () в методе модуля, она напечатает полезную нагрузку. Но я хотел бы вернуть ошибку и ответ из выборки, чтобы модуль вел себя как обобщенный c метод, а обработка и обработка ошибок выполнялась в вызывающем методе.

Ответы [ 2 ]

2 голосов
/ 22 марта 2020

Когда вы помечаете function как async, JavaScript всегда возвращает Promise, делая его асинхронным. Когда вы возвращаете значение, оно разрешает Promise. Использование await внутри этих функций «приостанавливает» выполнение (это технически создает новую асинхронную c функцию для кода, который следует) до тех пор, пока ожидаемое Promise не будет разрешено, вместо использования then(callback). Таким образом, вам не нужно then внутри любого async function.

Вам, однако, нужно трактовать свой собственный async function как Promise.

const fetch = require("node-fetch");
async function postLendingApplication(connection, data) {
    try {
      console.log("Processing POST Loan.");

      // the await eliminates the need for .then
      const res = await fetch(connection.url, {
          method: "POST",
          headers: connection.headers,
          body: data,
      })
      // this code is resumed once the fetch Promise is resolved.
      // res now has a value.
      console.log("Status: ", res.status);
      console.log("StatusText: ", res.statusText);
      return res;
   }
   catch(err) { 
     // because the promise could error, it is advised to use
     // try/catch. With a Promise, you would .then(cb).catch(errHandler)
     // but async/await doesn't utilize callbacks.

     // perform error handling or you can bubble it up.
    throw err
}

При вызове postLendingApplication(connection, data) убедитесь, что вы используете await, если внутри async function или postLendingApplication(connection, data).then(callback) в качестве возвращаемого значения будет Promise.

postLendingApplication(connection, data).then(callback).catch(errHandler)
0 голосов
/ 22 марта 2020

Вы забыли вернуть функцию формы. return await fetch(connection.url, { Вам не нужна async-await функция then. Вы можете вернуть res.json()

const fetch = require("node-fetch");
async function postLendingApplication(connection, data) {
    console.log("Processing POST Loan.");
    return await fetch(connection.url, {
        method: "POST",
        headers: connection.headers,
        body: data,
    }).then(res => {
        console.log("Status: ", res.status);
        console.log("StatusText: ", res.statusText);
        console.log("OK: ", res.ok);
        return res.json();
    });
}
...