node.jsでAPIを呼び出してリザルトをreturnしたい


GASを使用して以下のAPIを作成しデプロイしました。

[code]

    // Getメソッド用
    function doGet(e) {
        var p = e.parameter;
        var translatedText = LanguageApp.translate(p.text, p.source, p.target);
        return ContentService.createTextOutput(translatedText);
    }
     
    // Postメソッド用
    function doPost(e) {
        var p = JSON.parse(e.postData.getDataAsString());
        var translatedText = LanguageApp.translate(p.text, p.source, p.target);
     
        var output = ContentService.createTextOutput();
        output.setMimeType(ContentService.MimeType.JSON);
        output.setContent(JSON.stringify({ result: translatedText }));
     
        return output;
    }
    
[/code]

これをnodejsで呼び出すために次のコードを記述しました。

[code]

    const request = require('request');
    const url = デプロイしたURL;
    
    function translate(txt, src, tget){
        request.get({
            uri: url,
            headers: {'Content-type': 'application/json'},
            qs: {
                text: txt,
                source: src,
                target: tget
            },
            json: true
        }, function(err, req, data){
            return data;
        });
    };
    
    const result = translate('Hello, World!', 'en', 'ja');
    console.log(result);
    
[/code]

これを`node translate.js`と実行すると、

[code]

    undefined
    
[/code]

が返されます。  
また、特にエラーは発生していませんでした。

`return
data;`を`console.log(data);`に置換し最後の2行のコードを消すと`こんにちは世界！`という想定していた返り値が表示されました。

`こんにちは世界！`のように正常にreturnできるようにするコードを教えてください。

開発環境：  
nodejs 18.18.0  
npm 9.8.1




> `undefined` が返されます。

translate は非同期で動くので、応答が返ってくるのを待たずに `console.log(result);` が実行されるからだと思います。

なので、質問者さんが行ったように、応答が返ってくると呼ばれるコールバック function の中で処理するのが正解だと思います。

* * *

**【追記】**

JavaScript で今回のように API を呼び出す場合は Promise, async/await を使う fetch API
を利用することが多いと思います。

フェッチ API の使用  
<https://developer.mozilla.org/ja/docs/Web/API/Fetch_API/Using_Fetch>

具体的な使用例は以下の記事の「クライアント側 (MVC の View)」のコードを見てください。

Web API に CORS 実装 (CORE)  
<http://surferonwww.info/BlogEngine/post/2023/01/21/aspnet-core-web-api-with-
cors-middle-ware.aspx>

Node.js でも node-fetch をインストールすると使えるようになるそうです（未検証・未確認です）。試してみてはいかがでしょう。

Node.jsでAysnc/Awaitを使ってHTTPリクエストを行う5つの方法  
<https://www.twilio.com/ja/blog/5-ways-to-make-http-requests-in-node-js-using-
async-await-jp>




> `undefined` が返されます。

translate は非同期で動くので、応答が返ってくるのを待たずに `console.log(result);` が実行されるからだと思います。

なので、質問者さんが行ったように、応答が返ってくると呼ばれるコールバック function の中で処理するのが正解だと思います。

* * *

**【追記】**

JavaScript で今回のように API を呼び出す場合は Promise, async/await を使う fetch API
を利用することが多いと思います。

フェッチ API の使用  
<https://developer.mozilla.org/ja/docs/Web/API/Fetch_API/Using_Fetch>

具体的な使用例は以下の記事の「クライアント側 (MVC の View)」のコードを見てください。

Web API に CORS 実装 (CORE)  
<http://surferonwww.info/BlogEngine/post/2023/01/21/aspnet-core-web-api-with-
cors-middle-ware.aspx>

Node.js でも node-fetch をインストールすると使えるようになるそうです（未検証・未確認です）。試してみてはいかがでしょう。

Node.jsでAysnc/Awaitを使ってHTTPリクエストを行う5つの方法  
<https://www.twilio.com/ja/blog/5-ways-to-make-http-requests-in-node-js-using-
async-await-jp>

