web-dev-qa-db-ja.com

axiosとAndroidエミュレーターのネットワークエラー

APIを提供するNodeJSバックエンドで動作するReact-Nativeアプリケーションを取得しました。

私のReact-Nativeフロントは、ExpoとAxiosを使用して、NodeJS API(Hapi、Joi、Knexを使用)のルートにヒットし、(たとえば)DB(MySQL)を更新します。

すべてが私のiOSシミュレーターで適切に動作します。ただし、Android Emulator、ルートでの「ヒットしない」というヒットの一部に、次のエラーメッセージが表示されます:Network Error - node_modules/axios/lib/core/createError.js:16:24 in createError(実際には動作しましたが、フロントでは検出されません...)

私が言ったように、これは私のルートの一部にのみあるので、これは奇妙です。 http://localhost:8000/apihttp://10.0.2.2:8000/api Androidエミュレータが私のAPIにアクセスすることを確認します。この部分では問題ありません。

バギールートはiOSで正常に動作しており、Insomnia/Postman(localhost:8000/api/sendMail)。 Android Emulatorで動作していますが、アプリケーションはそれを検出しません。

これは私のコードの例です:

FRONT-ボタン「SendEmail」を押すと:

/* Button.js */
const sendAndEmailPromise = await sendEmail(this.state.email);

console.log(sendAndEmailPromise); // Output : NOTHING (not undefined, not null, N O T H I N G).

if (sendAndEmailPromise.status === 200) {
    // handle it
} else (sendAndEmailPromise.status === 403) {
    // etc. for each of my codeStatus that can be returned by my API 
}

/* MyAPI.js */
export function sendEmail(mail) {
    return axiosInstance
    .post(`/sendEmail`, null, {
      params: {
        mail
      },
    })
    .then(response => response) // Will not enter here
    .catch(error => {
       console.log(error); // Will output : NETWORK ERROR
    });
}

戻る-これはsendEmail promise:です

// Will return true of false :
const isMailSend = await sendTheEmail(mail);
console.log(isMailSend); // Output : TRUE and I receive the email on my gmail, so Android Emulator HIT the route.

if (isMailSend) {
  return handler
    .response({
      data: {
        message: "Email sent.",
      },
    })
    .code(200);
} else {
  // Handle it and return another response
}

「ネットワークエラー」ではなく、すべてが正常に機能し(実際に発生した...)、そのコードステータスが表示されることを期待しています。

さらに、Axiosで別のレベルのエラーが発生する可能性はありますか?より具体的な何か。

完全に同じではないが同等のものに関連しているように見えるGitHubの問題: https://github.com/axios/axios/issues/97

ありがとうございました。

10
GuillaumeRZ

ここでは2つの問題に対処しています。

1)「localhost」という単語をIPに解決できないため、エミュレータは機能しません。 localhost2.comを使用するようなもので、何かに解決されません。これは、サーバー192.x.x.xのローカルIPを指す必要があります

2)サーバーをlocalhostにバインドすると、192.x.x.xのようなローカル要求に解決できないため、サーバーを0.0.0.0にバインドする必要があります。バインディングを修正すると、エミュレータはサーバーを見る可能性があり、postmanもそうする可能性があります。

8
Panagiotis Vrs

ヘッダーにこれらのパラメーターを追加すると問題が解決しました

"Content-Type": "application/x-www-form-urlencoded",
  Accept: "application/json"
0
Waleed Arshad