20210724のNode.jsに関する記事は7件です。

Visual Studio Codeとts-nodeでシンプルなTypeScriptデバッグ環境を作る

はじめに VSCodeでTypeScriptをデバッグしたい時、割と環境構築が面倒だったりしませんか?ts-nodeを使えば簡単にデバッグできるようになるので、今回はそのやり方をご紹介します。 手順 ※プロジェクトディレクトリは作成済みとします ①npmを初期化 npm init ②TypeScriptをインストール npm install typescript @types/node@14 ※「14」の部分はお使いのNode.jsのバージョンに合わせてください ③ts-nodeをインストール npm install ts-node ④launch.jsonにエントリポイントを追加 launch.json "args": [ "${workspaceFolder}/src/index.ts" ] ⑤launch.jsonに下記設定を追加 launch.json "runtimeArgs": [ "-r", "ts-node/register" ] launch.json全体ではこんな感じです launch.json { "version": "0.2.0", "configurations": [ { "type": "pwa-node", "request": "launch", "name": "Launch Program", "runtimeArgs": [ "-r", "ts-node/register" ], "skipFiles": [ "<node_internals>/**" ], "args": [ "${workspaceFolder}/src/index.ts" ] } ] } 以上で設定は完了です。シンプルでしょ? 動作確認 プロジェクトディレクトリ直下にsrcディレクトリを作成し、下記のファイルを配置します index.ts import {testClass} from "./test"; const test = new testClass(); test.testFunction(); test.ts export class testClass { testFunction() { console.log("testFunction has called"); } } エントリポイントであるindex.tsでtestFunctionを呼び出すだけですね 最後に、好きな箇所にブレークポイントをセットしてデバッグ画面で先程作成したlaunch.jsonを選択し、実行ボタンをクリックします まずtestFunctionの呼び出し元がヒットし 次にtestFunctionの内部がヒットすることを確認できました 今回は以上です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ubuntu 20.04 へ Node.js と Yarn を導入

忙しい人用リンク 手順 Node.js の導入 1. curl のインストール bash $ sudo apt install curl -y 2. nodejs@14.x のセットアップスクリプトを取ってくる bash $ curl -sL https://deb.nodesource.com/setup_14.x -o nodesource_setup.sh 3. スクリプトの実行 実行前にいちおう nodesource_setup.sh の中身をチェックしてね。 bash $ less nodesource_setup.sh # OK なら実行 $ sudo bash nodesource_setup.sh 4. インストール bash $ sudo apt install nodejs $ node -v v14.17.2 Yarn 1. Yarn のレポジトリを有効化 bash $ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - 2. Yarn パッケージのレポジトリをシステムに追加 bash $ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list 3. インストール bash $ sudo apt update $ sudo apt install yarn $ yarn -v 1.22.5
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

npm install -g が失敗する場合の対処法

環境 Macですがlinuxなら同様の対処で解決するのではないでしょうか 特にバージョンは関係ないかと思います npm install -gをするとPermission deniedで失敗してしまう npmの新しいバージョンが使えるようになったということでnpm install -g npmでバージョンアップしようとしたところ、以下のようなエラーが出てしまいました npm ERR! Error: EACCES: permission denied, access '/usr/local/lib/node_modules/npm/node_modules/abbrev' npm ERR! [Error: EACCES: permission denied, access '/usr/local/lib/node_modules/npm/node_modules/abbrev'] { npm ERR! errno: -13, npm ERR! code: 'EACCES', npm ERR! syscall: 'access', npm ERR! path: '/usr/local/lib/node_modules/npm/node_modules/abbrev' npm ERR! } 原因 自明ですが権限エラーです 調べてみるとやはりroot権限になっていました $ ls -la /usr/local/lib/node_modules/npm total 512 // ・・・ drwxr-xr-x 360 root wheel 11520 10 9 2020 node_modules // ・・・ 対処 root権限である必要もないし、Macユーザをオーナーにしようと思ったので以下のコマンドで/usr/local/lib/node_modules以下の権限を全て変更しました $ sudo chown -R $USER /usr/local/lib/node_modules パスワードの入力を要求されるので入力してください 環境変数にユーザ名が登録されたいない場合は $ sudo chown -R $(whoami) /usr/local/lib/node_modules で変更してください ちなみに上記コマンドでは/usr/local/lib/node_modules以下のディレクトリが全てMacのユーザ権限になります ちなみに 別のユーザをオーナーにする場合は$USERの部分にユーザ名を入力してください 参考 stackoverflowに記事がありました https://stackoverflow.com/questions/48910876/error-eacces-permission-denied-access-usr-local-lib-node-modules
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

node.js+Express+pugでDBDのマップカウンターを作る

はじめに DBDという対人ゲームで、あるキャラクターを使うと苦手なマップばかり当たるので、猜疑心からマップカウンターを作りました。(なお結果としては私が苦手なマップがDBDに多いだけでした!) 目次 node.js+Express+pugインストール DBDのマップをスクリピング JSONの読み書き 動的リンクを扱う .pugへ変数を渡す .pugでhtmlを生成 cssの記述 1.node.js+Express+pugインストール ここを見ながらインストール 2.DBDのマップをスクレイピング 稚拙なソースですが動きます! dbdmap.py from time import sleep import json def main(): import requests from bs4 import BeautifulSoup FullURL = "https://deadbydaylight.fandom.com" URL = "https://deadbydaylight.fandom.com/wiki/Dead_by_Daylight_Wiki" page = requests.get(URL) soup = BeautifulSoup(page.content, "html.parser") results = soup.find(id="fpRealms") results = results.find("div", {"class": "fplinks"}) results = results.find_all("a") maplst = [] mapdict = {} for result in results: dbdmap = result["href"] if not dbdmap in maplst: maplst.append(dbdmap) for mapdbd in maplst: mapurl = FullURL + mapdbd mappage = requests.get(mapurl) mapsoup = BeautifulSoup(mappage.content, "html.parser") mapresults = mapsoup.find("table", {"class": "wikitable"}) mapresults = mapresults.find("tbody") mapresults = mapresults.find("tr") mapresults = mapresults.find_all("td") for mapresult in mapresults: mapresult = mapresult.find("center") mapresult = mapresult.find("a") mapdict[mapresult.text.strip()] = 0 sleep(3) with open('<保存したい場所>.json', 'w') as outfile: json.dump(mapdict, outfile) if __name__ == "__main__": main() これにより以下の様なJSONを得られる。 {"Coal Tower": 0, "Groaning Storehouse": 0, "Ironworks of Misery": 0, ... 3.JSONの読み書き ここで詰まったのでいくつか注意点を書いておきます jsonはクライアント側からは読み書きできません。 つまり生成されたウェブページに組み込まれたスクリプトからは操作できないです。そのためサーバー側で操作する必要があります。 また、サーバー側での操作はroutes/index.jsonで行います。(リクエストされたページに対応したファイル) const fs = require('fs'); const filePath = "./routes/dbdmap.json" //jsonを読み取る const dbdmaplst = require("./dbdmap.json"); //jsonに書き込む fs.writeFile(filePath, JSON.stringify(dbdmaplst), (err) => { if (err) console.log('Error writing file:', err) }) 4.動的リンクを扱う カウンターなので、index/"map名"/"up/down"のような動的リンクを扱えるようにします。 複数個設定できます。 router.get('/', function(req, res, next) { router.get('/:map/:vote', function(req, res, next) { 受け取ったリンクのキーワードを引数のように扱えます router.get('/:map/:vote', function(req, res, next) { const dbdmaplst = require("./dbdmap.json"); const vote = req.params.vote; if (vote == "up") { dbdmaplst[req.params.map] += 1; } else if (vote == "down") { if (dbdmaplst[req.params.map] > 0) { dbdmaplst[req.params.map] -= 1; } } 5.pugへ変数を渡す json形式で変数を渡します。 res.render('index', { title: 'Epress', dbdmap: dbdmaplst}); 以上index.jsの完全なソースはこちら index.js var express = require('express'); var router = express.Router(); //read json const fs = require('fs'); const filePath = "./routes/dbdmap.json" /* GET home page. */ router.get('/', function(req, res, next) { const dbdmaplst = require("./dbdmap.json"); res.render('index', { title: 'Epress', dbdmap: dbdmaplst}); }); router.get('/:map/:vote', function(req, res, next) { const dbdmaplst = require("./dbdmap.json"); const vote = req.params.vote; if (vote == "up") { dbdmaplst[req.params.map] += 1; } else if (vote == "down") { if (dbdmaplst[req.params.map] > 0) { dbdmaplst[req.params.map] -= 1; } } fs.writeFile(filePath, JSON.stringify(dbdmaplst), (err) => { if (err) console.log('Error writing file:', err) }) res.render('index', { title: 'DBD MAP LOG', dbdmap: dbdmaplst}); }); module.exports = router; 6 .pugでhtmlを生成 pugはpythonのようにインデントで管理されているようです。 以下ソース内に注意点を記載 index.pug //layout.pugをテンプレートに使う extends layout //テンプレート内のblock contentに置き換えられる block content //'-'を先頭に記載することでjavascriptを組み込むことができる。 -var count = 0; div(class="tbl") table(cellpadding=10) //pug 独自のfor/while/if-else文を扱える //ここの'dbdmap'はindex.jsから受け取ったもの each val, key in dbdmap -count += val; tr //'#{}'で変数を扱うことができる。 td #{val} td #{key} td a(href= "/" + key + "/up") up td a(href= "/" + key + "/down") down h2 Match count: #{count} pugの記述方法はこちら 7.cssの記述 cssよく分からないのですが、こんな感じにしたらいい感じになりました。。。 style.css body { padding: 50px; font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; } a { color: #00B7FF; } table, tr, td { border: 1px solid black; padding: 10px; } table { display: inline-block; float: left; } cssの読み込み方。テンプレートのlayout.pugに記載する。 layout.pug doctype html html head title= title body block content //javascript script(src='/javascripts/todo.js') //css link(rel='stylesheet', href='/stylesheets/style.css') 終わりに 以上すべてのソースコードを記載したわけではありませんが、詰まる恐れがある点について解説できました。 もし質問があればどうぞコメントにどうぞ。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Nodejsで使用するredis clientは何がベターなのかを調査する

はじめに *zennの記事の転記です 今後PaaS上での開発に移行するにあたり、Node jsを利用していくことになりました。 その際に使うredisクライアントのライブラリを調査してるのですが、そういやこういうものの調べ方や考えをまとめたことないなと思ったので、後輩とかに共有するためにちょっとまとめてみようと思います。 候補 → ioredis or node-redis まずは候補を探します。 redis公式 がおすすめを提示してくれていましたので、そのまま参考にします。 星マークがおすすめ。ニコちゃんマークは開発が活発なもの(過去6ヶ月で動きがあったもの)です。 以下3 repisitoriesがおすすめに上がっていますね。 ioredis node-redis tedis 最後のtedisだけスター数が少なく、以下redislabsのdocument referenceにもtedisが乗っていないので、こちらは一旦スルーします ioredisのdoc node-redisのdoc 比較 候補が2つに絞られたので比較をしていきます。基本はそれぞれの背景を見て、今のトレンドと性能比較をすればいいかな。 どちらにもいい点ありそうなら、いい点悪い点あげて比較するんですが、果たしてどうなるか。 機能 → ioredis > node-redis 元々はnode-redisがNode Redisという団体によって作成されたもので、こちら2010年から現在も活動されています。 ただ、promiseや、redisのpipelineのような一部機能をサポートしてないようです。 そのためか元Alibabaのエンジニアである Zihua Liさんがioredisを開発したようです。 機能面は純粋にioredisが上位互換と思って良さそう node-redisのpromiseはv4で正式サポートされるそうです 性能 → ioredis <= node-redis 以下を参考に。 poppinlp/node_redis-vs-ioredis どちらもほぼ同じですが、multiで動かした場合、batch vs pipelineでの比較はともに若干node-redisに軍配が上がっています。 batchって何かしらというと、node-redisで提供してるmultiを実行して結果をまとめて1つのコールバックでもらうという、利用者から見るとpipelineのような機能らしいです。 人気 → ioredis >> node-redis 以下を参考にしました。(npm trends、いいサイトですね) ioredis vs node-redis 2021/7/23時点の過去6ヶ月の記録でダウンロード数、スター数ともに圧倒的にioredisが上に。 その他 大手クラウド事業者のサンプルはnode-redisが多かったです。 AWS -> ioredis Amazon ElastiCache for Redis を使ったChatアプリの開発のサンプルコードを参照。 こちらはioredisを使用していました。 GCP -> node-redis Cloud Functions から Redis インスタンスへの接続のサンプルコードを参照。 node-redisを使ってますね。 Azure -> node-redis クイックスタート: Node.js で Azure Cache for Redis を使用するのサンプルコードを見ると、node-redisを使っています。 軽くググった感じでもnode-redisの方がサンプルは多そうでした。この辺は歴史の長さですかね。 ただ、ioredisのサンプルが少ないというわけではないですので、これでどちらが優位というほどではなさそうです。 結論 → 基本ioredisが良い 調査結果を改めてまとめます。 機能: ioredis > node-redis 性能: ioredis <= node-redis 人気: ioredis >> node-redis 性能がほぼ=と考えると、ioredisの方が優位に見えますね。個人的にも以下のように考えます 基本はioredisがいい 機能や互換性とかはどうでもいい、とにかく少しでも速いものが欲しいんじゃ!って人はnode-redis 以下でその理由を深堀していきます。 結論に至った理由 理由は以下です promiseの有無 node-redisでは次バージョンまでpromiseがないこと redis機能の充実度合い 性能向上に貢献しているpipelineがnode-redisは非サポート redisで提供している機能を使った性能を考えると、ioredisの方が性能がいいとも言える promiseがない 言わずもがなですね。promiseがないとJavaScriptのコードが一気に複雑化するので、promiseがないのは痛いです。 まあversion 4でサポートされることを考えると、将来的にはなくなる優位性かもしれません redis機能の充実度合い pipelineがない点について。こちら、node-redis公式でもpipelineの導入が議論されていました. しかし、redis側の提示しているpipelineの仕組みに欠点があることから採用を見送ったようです。おそらくその代わりにbatchがあるでしょうということなんだと ただ、redisのclientという標準的なプロトコルを実装するライブラリが、公式で提供されている機能を実装せず独自実装で同じ機能を提供するのって、すごく違和感があるんですよね。redis機能を使った上で+αならわかりますが これだと例えば公式がpipelineの欠点をredis側がカバーするようアップデートかけたとしても、pipelineを使ってないnode redisは恩恵を受けられないし。 標準プロトコルへの取り組み方が、ioredisの方がよりあるべき形であるように感じてしまいます。 もちろん性能にシビアな世界では速さが正義!カスタマイズ上等!だと思います。 ただ私は一定の性能が出てれば十分な世界でやっているので、基本redisを使った性能向上はredisの機能で実現したいです。 ですので、redis機能としてpipelineを実装しており、その上で性能が出ているioredisに軍配があがります。 本当にpipelineが必要か?問題 上記理由を書いたんですが、人によってはpipelineを使う必要がないため、この優位性がはまらない人もいると思います。 例えばSharing: Redis get pipeline vs mgetで実測されているように、近いことができるmgetの方がpipelineよりもさらに速いです。 redisは速度が正義であるなら、pipelineいらん、mgetでいいやん!となるところですね。 ただ、記事のPros/Consの通りでpipeline使い勝手がいいので、redisの中で使える機能が多いことはやはり優位に働きます。個人的にも今もredisを利用しているのですが、そこではこの使い勝手をとってpipelineを活用しているため、pipelineを提供しているのは優位だと思っています。 もちろん上記を優位に感じない → node-redisもあり つらつらと理由を書きましたが、promiseの話は先でなくなりますし、redis機能も使わない人にはどうでもいい話です。 なのでこの辺を気にせず速度に若干の優位性があるnode-redisを使う!って判断もありだと思います。その辺はなにを基準にするかですよね 最後に ここまでライブラリを選定するための調査から結論まで書きましたが、結局最後のところはチーム・個人の事情や趣味が色濃く出てきます。状況や見方を少し変えればいくらでも評価は変わるものなので、納得できる要素が集まったら後は決断!って感じがしますね。 その決断に納得感を得るためには、物事のベストプラクティスや設計に対する考え方などを日々学んで土台を広げていくことが大事なのかもしれません。 参考 Node.jsでRedis使うならioredisがおすすめ *記事に貼ったリンクは除く
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

node.jsを使ってxmlをjsonにParseしたい

node.jsを使ってxmlをjsonにParseしたい 使ったライブラリ xml2js いくつかあるライブラリの中で最も人気が高かった。xmlに準拠していて、jsonをxmlに変換することも可能。 fs 今回はxmlファイルを読み込むのでこのファイルを読んだり書いたりするnodeの標準モジュールを使用した。 const fs = require("fs");; const xml2js = require("xml2js"); var sampleXml = './exmample/test.xml' //parseしたいxmlファイルのあるパスを書きます。 まずは、xmlのファイルを読み込んでいきます。 var xmlData = fs.readFileSync(sampleXml, "utf-8"); //fsのreadFilesSyncメソッドを使います //このメソッドは、第一引数に読み込みたいもの。第二引数にそのものの文字コードを入れます。 次に読み込んだファイルをjson形式にparseしませう。 xml2js.parseString(xmlData, function (err, result) { if (err) { console.log(err.message) } else { console.log(result) } } これで、parseされたjsonがコンソールに表示されます。 最近はjson形式でのデータのやり取りが多いですが、古めかしい大きなシステムではいまだにxml を使っていたりします。 データの加工はjsonの方がやりやすいと思うので、ひとつくらいpaese方法を知っておくと良きでしょう。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Stripeによる署名検証をFirebase Cloud Functionsを利用してローカルで行う

Motivation 最近流行の決済サービスであるStripeであるが、決済処理時のエンドポイントに送信するWebhookイベントのヘッダに署名を含めることができる。これによりそれがサードパーティでなくStripeによって送信されたものであるかどうかを検証することができる。 そこで、本記事ではこの署名検証処理をローカルで手軽にテストできるようにすることを目的とする。 Prerequisite テスト環境 OS: macOS node: v14.17.3 Firebase Cloud Functions プロジェクトの追加やCLIでのログインは省略 詳しくはこちら:https://firebase.google.com/docs/functions/get-started Cloud Functionsの実装 index.ts import * as express from "express"; import * as functions from "firebase-functions"; import { https } from "firebase-functions"; import Stripe from "stripe"; // 環境変数 const SECRET_KEY = "sk_xxxx"; // APIキー const ENDPOINT_SECRET = "whsec_XXXX"; // 署名シークレット。後述のStripe CLIによるサーバー起動時に表示されるシークレットを指定する。 const app = express(); // webhook app.post("/webhook-stripe/", async (req, res) => { const signature = req.headers["stripe-signature"];// ここに署名が入っている if (!signature) { throw new Error("no avalilable signature header"); } try { const stripe = new Stripe(SECRET_KEY, { apiVersion: "2020-08-27", }); // 署名検証 const firebaseRequest = req as https.Request; const event = stripe.webhooks.constructEvent(firebaseRequest.rawBody, signature, ENDPOINT_SECRET); res.status(200).send(); } catch (e) { console.log(e); res.status(500).send(`Verification Error: ${e.message}`); } }); export const verifySignature = functions.https.onRequest(app); ハマったポイント stripe.webhooks.constructEvent()の第一引数に渡すpayloadは、stripeからのraw request body(Buffer)を渡さなければいけないが、通常の方法だとなぜか上手くいかず「No signatures found matching the expected signature for payload. Are you passing the raw request body you received from Stripe?」のエラーが出た。 原因:Cloud Functions + Expressの環境では、requestがデフォルトでjsonパースされているみたいで、どうしてもraw bodyが取得できなかった 解決法: import { https } from "firebase-functions"; ... const firebaseRequest = req as https.Request; // -> firebaseRequest.rawBodyをstripe.webhooks.constructEventのpayloadで渡すようにする ローカルでエミュレート $ firebase emulators:start これにより、http://localhost:5001/{projectId}/{region}/{functionName}/{functionPath}/ で署名検証用のCloud Functionsが立ち上がる。このURLはwebhook URLとして、後述のStripe CLIでサーバーを起動するときに指定する。 ここで、functionNameはverifySignature、functionPathはwebhook-stripe/である。 region, projectIdはご自身のFirebaseに作成したプロジェクトのリージョン及びプロジェクトIDを参照すること。 Stripe アカウント作成 省略 CLIのインストール $ brew install stripe/stripe-cli/stripe ログイン $ stripe login # ブラウザに遷移するので、画面に従い認証を行う CLIによるサーバー起動 $ stripe listen --forward-to http://localhost:5001/{projectId}/us-central1/verifySignature/webhook-stripe/ # 署名シークレットが表示されるため、これで index.ts 内で指定するものを更新し、再度firebase emulators:start で起動し直す Test & Result リクエストの形式 $ stripe trigger <EVENT_NAME> に入れるべきものは、以下で確認可能 $ stripe trigger --help ... Supported events: account.updated balance.available charge.captured ... 実際にstripeに何らかのリクエストを投げる $ stripe trigger balance.available ... functions: Beginning execution of "us-central1-verifySignature" { id: 'evt_1JGOSGFZkFlFEY6jnM5qUSGL', object: 'event', api_version: '2020-08-27', created: 1627047019, data: { object: { id: 'pi_1JGOSEFZkFlFEY6jH4vzdVHS', object: 'payment_intent', amount: 2000, amount_capturable: 0, amount_received: 2000, application: null, application_fee_amount: null, canceled_at: null, cancellation_reason: null, capture_method: 'automatic', charges: [Object], client_secret: 'pi_1JGOSEFZkFlFEY6jH4vzdVHS_secret_oIsYsVEmk91lO3D8RERkUU0JO', confirmation_method: 'automatic', created: 1627047018, currency: 'usd', customer: null, description: '(created by Stripe CLI)', invoice: null, last_payment_error: null, livemode: false, metadata: {}, next_action: null, on_behalf_of: null, payment_method: 'pm_1JGOSEFZkFlFEY6jre53Hhu9', payment_method_options: [Object], payment_method_types: [Array], receipt_email: null, review: null, setup_future_usage: null, shipping: [Object], source: null, statement_descriptor: null, statement_descriptor_suffix: null, status: 'succeeded', transfer_data: null, transfer_group: null } }, livemode: false, pending_webhooks: 3, request: { id: 'req_f1Qn79RYEzu0Lm', idempotency_key: null }, type: 'payment_intent.succeeded' } i functions: Beginning execution of "us-central1-verifySignature" i functions: Beginning execution of "us-central1-verifySignature" { id: 'evt_1JGOSGFZkFlFEY6j57JY0AMQ', object: 'event', api_version: '2020-08-27', created: 1627047019, data: { object: { id: 'ch_1JGOSFFZkFlFEY6jjreb2LGJ', object: 'charge', amount: 2000, amount_captured: 2000, amount_refunded: 0, application: null, application_fee: null, application_fee_amount: null, balance_transaction: 'txn_1JGOSFFZkFlFEY6jXw83a3Wy', billing_details: [Object], calculated_statement_descriptor: 'Stripe', captured: true, created: 1627047019, currency: 'usd', customer: null, description: '(created by Stripe CLI)', destination: null, dispute: null, disputed: false, failure_code: null, failure_message: null, fraud_details: {}, invoice: null, livemode: false, metadata: {}, on_behalf_of: null, order: null, outcome: [Object], paid: true, payment_intent: 'pi_1JGOSEFZkFlFEY6jH4vzdVHS', payment_method: 'pm_1JGOSEFZkFlFEY6jre53Hhu9', payment_method_details: [Object], receipt_email: null, receipt_number: null, receipt_url: 'https://pay.stripe.com/receipts/acct_1JExhyFZkFlFEY6j/ch_1JGOSFFZkFlFEY6jjreb2LGJ/rcpt_JuCrnUA8LSppUxCxBQ58XX5CbdP0igP', refunded: false, refunds: [Object], review: null, shipping: [Object], source: null, source_transfer: null, statement_descriptor: null, statement_descriptor_suffix: null, status: 'succeeded', transfer_data: null, transfer_group: null } }, livemode: false, pending_webhooks: 3, request: { id: 'req_f1Qn79RYEzu0Lm', idempotency_key: null }, type: 'charge.succeeded' } { id: 'evt_1JGOSGFZkFlFEY6jXdUgwE4B', object: 'event', api_version: '2020-08-27', created: 1627047018, data: { object: { id: 'pi_1JGOSEFZkFlFEY6jH4vzdVHS', object: 'payment_intent', amount: 2000, amount_capturable: 0, amount_received: 0, application: null, application_fee_amount: null, canceled_at: null, cancellation_reason: null, capture_method: 'automatic', charges: [Object], client_secret: 'pi_1JGOSEFZkFlFEY6jH4vzdVHS_secret_oIsYsVEmk91lO3D8RERkUU0JO', confirmation_method: 'automatic', created: 1627047018, currency: 'usd', customer: null, description: '(created by Stripe CLI)', invoice: null, last_payment_error: null, livemode: false, metadata: {}, next_action: null, on_behalf_of: null, payment_method: null, payment_method_options: [Object], payment_method_types: [Array], receipt_email: null, review: null, setup_future_usage: null, shipping: [Object], source: null, statement_descriptor: null, statement_descriptor_suffix: null, status: 'requires_payment_method', transfer_data: null, transfer_group: null } }, livemode: false, pending_webhooks: 3, request: { id: 'req_f1Qn79RYEzu0Lm', idempotency_key: null }, type: 'payment_intent.created' } i functions: Finished "us-central1-verifySignature" in ~1s i functions: Finished "us-central1-verifySignature" in ~1s i functions: Finished "us-central1-verifySignature" in ~1s i functions: Beginning execution of "us-central1-verifySignature" { id: 'evt_1JGOSGFZkFlFEY6jPyo2vocQ', object: 'event', api_version: '2020-08-27', created: 1627047020, data: { object: { object: 'balance', available: [Array], livemode: false, pending: [Array] } }, livemode: false, pending_webhooks: 3, request: { id: null, idempotency_key: null }, type: 'balance.available' } すなわち、署名検証を行なった結果、Stripeからのリクエストであることが証明された。 Couclusion Firebase Cloud Functionsのローカルエミュレーションを用いて、Stripeの署名検証テストを行うことができた。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む