質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

解決済

1回答

2322閲覧

FirebaseのCloud FunctionsでonCallすると内部でhttp.getを行いそれに応じた郵便番号を返したい

massaru1221

総合スコア1

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

0グッド

0クリップ

投稿2021/10/14 13:43

Node.js

1const functions = require("firebase-functions"); 2const admin = require('firebase-admin'); 3let http = require('https'); 4admin.initializeApp(); 5 6 7exports.postalCode = functions.https.onCall(async (data, context) => { 8 //const URL = "https://zipcloud.ibsnet.co.jp/api/search?zipcode="+data.text; 9 const URL = 'https://zipcloud.ibsnet.co.jp/api/search?zipcode=100-0002'; 10 var data = []; 11 http.get(URL, (res) => { 12 let body = ''; 13 res.setEncoding('utf8'); 14 15 res.on('data', (chunk) => { 16 body += chunk; 17 data.push(body); 18 }); 19 20 res.on('end', (res) => { 21 return data[0]; 22 }); 23 }).on('error', (e) => { 24 console.log(e.message); //エラー時 25 }); 26});

このようなコード内容でアプリ側(Flutter)から叩いた時にdata[0]が返ってこないです

エラー文(Flutter側)

Error: [firebase_functions/internal] internal

at Object.throw_ [as throw] (http://localhost:8080/dart_sdk.js:5061:11) at https_callable_web.HttpsCallableWeb.new.call (http://localhost:8080/packages/cloud_functions_web/https_callable_web.dart.lib.js:39:23) at call.throw (<anonymous>) at http://localhost:8080/dart_sdk.js:38645:38 at _RootZone.runBinary (http://localhost:8080/dart_sdk.js:38515:59) at _FutureListener.thenAwait.handleError (http://localhost:8080/dart_sdk.js:33724:33) at handleError (http://localhost:8080/dart_sdk.js:34281:51) at Function._propagateToListeners (http://localhost:8080/dart_sdk.js:34307:17) at _Future.new.[_completeError] (http://localhost:8080/dart_sdk.js:34157:23) at async._AsyncCallbackEntry.new.callback (http://localhost:8080/dart_sdk.js:34193:31) at Object._microtaskLoop (http://localhost:8080/dart_sdk.js:38778:13) at _startMicrotaskLoop (http://localhost:8080/dart_sdk.js:38784:13) at http://localhost:8080/dart_sdk.js:34519:9

どうかご教授の程よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

レスポンスが帰ってこない原因としては

  • onCallのcallbackの中でPromiseを返せていない
  • http.getの処理をawaitして待たないため、関数が即座に終了してしまい、正しい処理が行われない
  • これらの例外が処理されていない

ため、エラーコード500, Internal Errorが発生しているのだと思います。

httpsよりは、axiosを使ったほうがGETリクエストを処理しやすく、async/awaitでの記述を活かすことができると思います。
以下は書き換えた場合の参考のコードになります。動作確認までは完全にできていませんが、http.getをawait axios.get()に書き換え、エラーが発生した場合はキャッチし、functions.HttpsErrorを呼び出し元に返却するようにすると、関数として正しく動作するようになると思います

HttpsErrorについては以下のURLで詳細を確認できます。

js

1const axios = require('axios'); 2const url = "https://qiita.com/api/v2/items"; 3const functions = require("firebase-functions"); 4 5exports.postalCode = functions.https.onCall(async (data, context) => { 6 try { 7 const URL = 'https://zipcloud.ibsnet.co.jp/api/search?zipcode=100-0002'; 8 const res = await axios.get(url); 9 return res.data // ★要調整 10 } catch (error) { 11 throw new functions.HttpsError(...); // ★ 適切なErrorを返す 12 } 13});

投稿2021/10/19 13:09

sgr_ksmt

総合スコア63

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問