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

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

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

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Node.js

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

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

解決済

1回答

2344閲覧

Lambda(nodejs)関数でres.sendのレスポンス(body)が2重エンコード(バックスラッシュ挿入)される

inasena

総合スコア1

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Node.js

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

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

0クリップ

投稿2021/11/23 13:17

前提・実現したいこと

Lambda(nodejsv14.x)で関数を呼ばれたらあるURLへリダイレクトさせたい。
(今後は、API Gatewayと連携する予定)

ここに質問の内容を詳しく書いてください。

ローカル環境でnodejsv14.18.1+expressでコードを書き、
Zipアーカイブをlambdaへアップロードしてデプロイしています。

index.jsは以下です。
/********************
const serverless = require('serverless-http');
const express = require('express');
const app = express();

const cors = require('cors');
app.use(express.json());
app.use(cors());

app.get('/', async(req, res) => {
res.status(302).send({location:'https://www.yahoo.co.jp'});
});

const port = '8080';
app.listen(port, () => {
console.log(app start listening on port ${port});
});

module.exports.handler = serverless(app);
/********************

これを実行すると以下のレスポンスとなり、
{
"statusCode": 302,
"headers": {
"x-powered-by": "Express",
"access-control-allow-origin": "*",
"content-type": "application/json; charset=utf-8",
"content-length": "38",
"etag": "W/"26-i4UEPVkgXYYLtqFkdN7mKdy9DJs""
},
"isBase64Encoded": false,
"body": "{"location":"https://www.yahoo.co.jp\"}"
}

■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題

bodyの中身がバックスラッシュのエスケープ文字でエンコードされてしまいます。 "body": "{\"location\":\"https://www.yahoo.co.jp\"}" bodyは "body": {"location":”https://www.yahoo.co.jp"} となることを期待しています。

該当のソースコード

nodejs+express

1/******************** 2const serverless = require('serverless-http'); 3const express = require('express'); 4const app = express(); 5 6const cors = require('cors'); 7app.use(express.json()); 8app.use(cors()); 9 10app.get('/', async(req, res) => { 11 res.status(302).send({location:'https://www.yahoo.co.jp'}); 12}); 13 14const port = '8080'; 15app.listen(port, () => { 16 console.log(`app start listening on port ${port}`); 17}); 18 19module.exports.handler = serverless(app); 20/********************

いろいろネット調べていますが、解決方法が見つかりません。
何か方法ございますでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

オブジェクトを渡すとJSON化されてしまうということでは?

ケース1:文字列で受け取りたい場合
文字列で渡せば良いかと思います。

JavaScript

1res.status(302).send("{location:'https://www.yahoo.co.jp'}");

ケース2:オブジェクトで受け取りたい場合
JSONで送られてきているので、パースすれば良いかと思います。

JavaScript

1foo = JSON.parse(レスポンス["body"])

ただ、Location:は、ヘッダに書かないといけないのでは?

投稿2021/11/23 15:28

otn

総合スコア85901

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

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

inasena

2021/11/24 01:58

回答ありがとうございます。 >ただ、Location:は、ヘッダに書かないといけないのでは? https://qiita.com/takyam/items/1789b4bea02f608e7a05 このサイトを参考に、Lambdaのレスポンスのbody.locationをAPI GatewayでヘッダのLocationにマッピングしようとしていました。 ただし、API Gatewayで受け取るLambdaのレスポンスがバックスラッシュ挿入された値になっていて、API Gatewayの統合レスポンスのマッピングテンプレートでパース処理しようとしたのですが、うまくいかずでこまっていたところでした。 ケース1を試してみたいと思います。 ありがとうございます。
otn

2021/11/24 02:07

よくわかりませんが、お書きのサイトに、 > integration.response.body.location と書いてあるので、単なる文字列じゃなくて、やっぱりJSONを渡すのでは?
inasena

2021/11/24 14:38

いろいろいじりましたが、 /******** exports.handler = async function(event, context) { context.succeed({location: "https://www.yahoo.co.jp"); }; /************** としてうまくいくことができました。 expressを使ったやり方では、どうしてもエスケープ文字処理解決できず、、、不甲斐なさに落ち込んでしまいましたが、 回答いただきありがとうございました。 今後も精進したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問