20210426のNode.jsに関する記事は5件です。

AWS LambdaからCloudWatchへの出力の際に、ログイベントが分割される場合の解決方法

※個人の備忘録です 実行環境 ・Node.js ・AWS Lambda 内容 AWS LambdaからCloudWatchへログを出力させた際に、なぜかログイベントが改行されて表示されており、 原因が分からず困ったので、その際の解決方法を記載します。 lambdaにはサーバーにssh接続した後、サーバーのソフトウェアを取得するコマンドを記載しており、 stream.pipe(process.stdout)でCloudWatchへ出力させていました。 実際のシェル上ではコマンドの結果は改行されて表示されているのに、lambdaの実行結果が出力されているCloudWatchでは1つのログイベントではなく複数のログイベントに渡ってコマンドの実行結果が出力されており、理由がわかりませんでした。 結論としては、改行コード(\n)が含まれているとCloudWatchでも改行されて表示されるためでした。 なので、コマンドの最後に| tr -d "\n" \r"を付けたすことで、解決出来ました。 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Node - Koa - Typescript Project の始め方

はじめに 業務でKoaを使うことになったので、Githubのサンプルに沿って勉強していきます。 Node - Koa - Typescript Project の始め方 サンプルをクローン mkdir sample-pjt && cd sample-pjt git clone https://github.com/javieraviles/node-typescript-koa-rest cd node-typescript-koa-rest yarn ローカルで開発する場合の微修正 SSLの説明で書かれている通り、server.tsの微修正が必要です。 server.ts ... createConnection({ type: 'postgres', url: config.databaseUrl, synchronize: true, logging: false, entities: config.dbEntitiesPath, ssl: config.dbsslconn, // if not development, will use SSL // ↓この中身をコメントアウトする extra: { // ssl: { // rejectUnauthorized: false, // Heroku uses self signed certificates // }, }, }) ... また、.example.envを.envに修正します。 DBコンテナをホスト portが被るので、postgresアプリを起動している場合は、コンテナを立ち上げる前に停止しておきましょう。 docker-compose up ローカル開発スタート yarn watch-server DBの動作確認 とりあえずmigrationが成功していることがわかります。 docker-compose exec db psql -U user apidb apidb=# \dt List of relations Schema | Name | Type | Owner --------+------+-------+------- public | user | table | user (1 row) apidb=# select * from "user"; #ちゃんと"user"にしてくださいね。一応。 id | name | email ----+------+------- (0 rows) また、http://localhost:8080/にアクセスしてブラウザ上で確認することもできます。 JWTの設定 説明に書いてある通り、Bearerトークン(下記)を設定してリクエストします。 Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjEiLCJuYW1lIjoiSmF2aWVyIEF2aWxlcyIsImVtYWlsIjoiYXZpbGVzbG9wZXouamF2aWVyQGdtYWlsLmNvbSJ9.rgOobROftUYSWphkdNfxoN2cgKiqNXd4Km4oz6Ex4ng https://jwt.io/#debugger-ioでトークンの中身を見ることもできます。 POSTMANでの動作確認 SwaggerでAPIのドキュメントを見る http://localhost:3000/swagger-jsonにAPIドキュメントが出力されます。 このエンドポイントはデフォルト設定で上記URLになっていますが、src/protectedRoutes.tsの中で設定することができます。 Swagger Editorに上のURLを読み込ませればAPIのドキュメントを表示することができます。 最後に このサンプルはリクエストのvalidationやJWTのハンドリングを全て示してくれています。ありがたく使わせていただきましょう。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Expressを使用してブラウザにHello Worldを出力する

初めに 今回は、Expressを使用して、ブラウザにHellow Worldを出力させるまでの手順を投稿します。 既にnpmを使用してexpressをインストールしている状態になります。 インストールがお済でない方は、Expressの公式サイトを参考にしてインストールを行ってください。 環境 ■OS Amazon Linux2 ■仮想マシン VirtualBox ■ソースコードエディタ Windows版 Visual Studio Code(以下VScodeと略す) ■使用PC Windows10 ※Amazon Linux2はVirtualBoxを用いて導入し、Expressのファイルを編集するためにsambaを使用しています。 下記にイメージ図を添付しております。 プロジェクトの作成 まず初めに、express-generatorをインストールしてプロジェクトの作成を行います。 express-generatorをインストールすることで、プロジェクトを簡単に作成できるようになります。 $ npm install express-generator -g npm WARN deprecated mkdirp@0.5.1: Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.) /home/ec2-user/.nvm/versions/node/v14.16.1/bin/express -> /home/ec2-user/.nvm/versions/node/v14.16.1/lib/node_modules/express-generator/bin/express-cli.js + express-generator@4.16.1 updated 1 package in 0.531s 次に、プロジェクトの作成を行います。 プロジェクトの作成を行う際に、rootユーザーで作成を行うと、下記画面のようにWindows版のVScodeで編集の権限がなくなってしまいます。 権限の設定を行えば使用できるようになりますが、今回は一般ユーザーでプロジェクトを作成します。 viewの後には、テンプレートエンジンを指定します。 プロジェクト名はstockという名称で作成します。 $ express --view=ejs stock create : stock/ create : stock/public/ create : stock/public/javascripts/ create : stock/public/images/ create : stock/public/stylesheets/ create : stock/public/stylesheets/style.css create : stock/routes/ create : stock/routes/index.js create : stock/routes/users.js create : stock/views/ create : stock/views/error.ejs create : stock/views/index.ejs create : stock/app.js create : stock/package.json create : stock/bin/ create : stock/bin/www change directory: $ cd stock install dependencies: $ npm install run the app: $ DEBUG=stock:* npm start stockというディレクトリが作成され、その配下にExpressの雛形が作成されます。 必要なパッケージのインストール 次に、依存関係にあるパッケージのインストールを行います。 インストールは、stockディレクトリに移動してから行います。 $ cd stock/ $ npm install npm notice created a lockfile as package-lock.json. You should commit this file. added 54 packages from 38 contributors and audited 55 packages in 1.442s found 0 vulnerabilities 次に、nodemonをインストールします。 nodemonはファイルに変更があると自動でサーバーを再起動してくれるツールです。 では、インストールを行います。 $ npm install -g nodemon /home/ec2-user/.nvm/versions/node/v14.16.1/bin/nodemon -> /home/ec2-user/.nvm/versions/node/v14.16.1/lib/node_modules/nodemon/bin/nodemon.js > nodemon@2.0.7 postinstall /home/ec2-user/.nvm/versions/node/v14.16.1/lib/node_modules/nodemon > node bin/postinstall || exit 0 npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@~2.3.1 (node_modules/nodemon/node_modules/chokidar/node_modules/fsevents): npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.3.2: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"}) + nodemon@2.0.7 added 119 packages from 53 contributors in 2.978s nodemonのインストール後に、package.jsonファイルを編集します。 package.jsonファイルのscripts セクションにnodemonを起動した時のパスを記入します。 /stock/package-lock.json { "name": "stock", "version": "0.0.0", "private": true, "scripts": { "start": "node ./bin/www", "devstart": "nodemon ./bin/www" ・・・ここを追記 }, "dependencies": { "cookie-parser": "~1.4.4", "debug": "~2.6.9", "ejs": "~2.6.1", "express": "~4.16.1", "http-errors": "~1.6.3", "morgan": "~1.9.1" }, "devDependencies": { "nodemon": "^2.0.7" } } nodemonを起動します。 $ DEBUG=stock:* npm run devstart > stock@0.0.0 devstart /home/share/training/stock > nodemon ./bin/www [nodemon] 2.0.7 [nodemon] to restart at any time, enter `rs` [nodemon] watching path(s): *.* [nodemon] watching extensions: js,mjs,json [nodemon] starting `node ./bin/www` サーバーが起動しました。 試しに、3000番ポートにアクセスしてみます。 開発環境とブラウザのOSが同じであれば、localhostを使用してアクセスすることができます。 私の様に、開発環境にゲストOS、ブラウザはホストOSから確認を行いたい場合は「http://<ゲストOSのIPアドレス>:3000」でアクセスすることができます。 では、ブラウザで確認を行います。 無事にExpressのデフォルトのページにアクセスできました。 Hello Worldの出力 では、先ほどのページをHello Worldという記述に変更します。 /stock/routes/index.js var express = require('express'); var router = express.Router(); /* GET home page. */ router.get('/', function(req, res, next) { res.send('Hello World' ); }); module.exports = router; 先ほどと同じURLにアクセスします。 ExpressのデフォルトのページがHello Worldに変更されていることを確認しました。 以上になります。 ありがとうございました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

winユーザーがnodeをインストールするまで Chocolatey & nvm

はじめに windows10でnodeを入れた記事になります。 nodeを入れるにあたり、色々調べつつ何とかインスコできたので その手順を公開しておく! 手探りでインストールしたため不正確な部分があるかもしれませんが 誰かの役に立てば幸いです。 nodeインストールまでの流れ Chocolatey → nvm → node この順番で進めていく Chocolateyから直接nodeをインストール出来るようですが バージョンマネージャ(nvm)を噛ませて、複数バージョン使える状態の方が良いそうだ。 Chocolateyのインストール PowerShellから以下コマンドを実行 iwr https://chocolatey.org/install.ps1 -UseBasicParsing | iex しばらく時間がかかるので放置。 完了すると以下のような文言が出ます。 ~(省略)~ first prior to using choco. Ensuring Chocolatey commands are on the path Ensuring chocolatey.nupkg is in the lib folder 途中でWarningみたいなのが出ますが、放っておけば大丈夫でした。 nvmのインストール 続いてnvmのインストール PowerShellで以下コマンドを実行 choco install nvm 途中で下のような文言が出てきます。 Do you want to run the script?([Y]es/[A]ll - yes to all/[N]o/[P]rint): スクリプトを実行していいか聞かれているので、「y」を入力してEnter インストール出来ているか確認 nvmのインストール後にPowerShellを開き直し、以下コマンド nvn 下の画像のような感じで出れば大丈夫です nodeのインストール 今回は14.4.0をインストールします nvm install 14.4.0 利用可能なバージョン 以下のコマンドでバージョンの一覧が見れる nvm list available インストール出来ているか確認 インスコ出来ていれば、以下のコマンドでnodeのバージョンが表示できます。 node -v ここまで出来たらnodeのインストールは完了です! おまけ せっかくなので、nodeを対話モードで実行してみる nodeコマンド 以下実行 node ↓のように「>」が出てきて、jsを一行づつ実行できる状態になります。 nodeでHello World 以下のコマンドを1行づつ実行します > const hoge = 'Hello World'; > hoge
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

あらためて noble でガジェットを扱う話に着手する: toio と micro:bit を複数混在させてスキャン、toio の複数制御(6台分)

以前、Mac上での「@abandonware/noble」を使った BLEスキャンで、特定のデバイスがスキャンできないことがあり、最近それが解決できたという流れがありました(以下の 2つが、その関連記事)。 ●【IoTLT 2019】新しい obniz で obniz-noble を試す(2019/12/22) - Qiita  https://qiita.com/youtoy/items/1a2e92ae7a83df7e9a82 ●Mac で noble を使って BLE対応のデバイスをスキャンする(2021年4月版) - Qiita  https://qiita.com/youtoy/items/d9c8ff3a33985359f39b そこで、以前やろうとしていた「Mac上での noble を使った BLE経由でのガジェット制御」にあらためて手をだしてみようと思い、この記事に書いた内容を進めていきました。 複数台の toio と micro:bit を混在させてスキャンしてみる ゆくゆくは、異なるデバイスがそれぞれ複数台ある時に、それらをまとめて制御するようなことが試せればと思っています。そこで、まずは準備段階として toio・micro:bit を複数台準備して、単純なスキャンを行ってみることから試しました。 micro:bit に関しては、以下のツイートの画像にあるような BLE UART が実行される部分を含むプログラムを書き込んであります。 micro:bit V2 + Micro: Maqueen の組み合わせで、さらに BLE を一緒に使うものを試そうと思って手をつけられていなかったもの、試してみようかと思って、まずは MakeCode側のプログラムを試しに作ってみているところ。 pic.twitter.com/sTTLWUUzf4— you (@youtoy) April 25, 2021 まずは @abandonware/noble の公式サンプルを元にしたシンプルなスキャンと、スキャン結果の表示をするプログラムを書き、その結果の中の toio と micro:bit 関連の情報を見てみました。得られたスキャン結果は以下のとおりで、その中の両デバイスの localName の ? という部分は、固有の文字列が表示されたことを示しています。 toio id:【文字列】 address:【文字列】 addressType: "random" connectable: true advertisement: localName: "toio Core Cube-???" serviceUuids":["10b201005b3b45719508cf3efcd7bbae"] rssi:【数値】 mtu: null state: "disconnected" micro:bit id:【文字列】 address:【文字列】 addressType: "random" connectable: true advertisement: localName: BBC micro:bit [???]" (serviceUuids自体がない) rssi:【数値】 mtu: null state: "disconnected" 今回のスキャンを行った際の前提となる話があるのですが、これらのデバイスのファームウェア等のバージョンが違うと、スキャンできる情報が少し異なるようでした。これ以降の記事の内容は、toio v02.0005(2021/3/17版) と micro:bit のファームウェア 0255(V2用)となったデバイスを前提として進めています。 以上の 2つのデバイスのスキャン結果を比べてみたところ、得られた情報で 1つ大きな違いがあります。具体的には micro:bit は advertisement の中に localName しか含んでおらず、serviceUuids の部分がありません。 この serviceUuids の有無という話がスキャン周りの話で影響する部分があり、少し注意が必要そうです。具体的には、以下のスキャン時の対象をフィルタする仕様に関する部分です。 これらを総合して考えると、micro:bit のスキャンに関しては、この service UUID を使ったフィルタを行うことはできないようです。 上記の話をググってみると、この話に触れている以下のような記事も見つかりました。この記事では、スキャンした結果に対して「localName」を使った前方一致の処理を行うことでフィルタをしていました。  ●Raspberry PiのBLEをNode.jsのnobleから叩いてmicro:bitを見つけてみる - Androidのメモとか   https://relativelayout.hatenablog.com/entry/2019/10/07/232655 この処理と、 @abandonware/noble の公式サンプルを元に、toio と micro:bit のみをスキャンする処理を書いてみました。 const noble = require("@abandonware/noble"); noble.on("stateChange", async (state) => { if (state === "poweredOn") { await noble.startScanningAsync(); } else { await noble.stopScanningAsync(); } }); noble.on("discover", async (peripheral) => { const localName = peripheral.advertisement.localName; if (localName && (localName.startsWith('BBC micro:bit')||localName.startsWith('toio Core Cube'))) { console.log(`${peripheral.address} (${localName})`); } }); これで、周りに他の BLE を使っているデバイスがあっても、スキャン後に toio と micro:bit のみを対象として続きの処理を行う準備ができました。 Async を使った処理 個人的に @abandonware/noble のサンプルを見ていて気になった部分があったので、それについて触れておきます。具体的には、 startScanningAsync や stopScanningAsync など、Async が名前についた部分の処理です。 GitHub の説明を見ていると、以下のような記載がありました。どうやら「全ての処理は 2種類の API があり、1つのコールバックを返すもとの 1つの Promise を返すもの(※ こちらが Async が suffix として付いたもの)」がそれぞれ利用可能なようです。 複数の toio への接続を試す(+書き込みを行う) ここから複数のデバイスへの接続に進んでいこうと思うのですが、簡単のために、いったん toio のみを対象にして、複数のデバイスへの接続を試していきます。また、接続した後に複数台への書き込みも試してみようと思います。 ここで試す内容は「6台の toio に接続し、それら全てに書き込みを行う」というもので、書き込みはモーターを動かす処理を使います。以下に、ソースコードや動作している様子の動画を掲載します。 モーターの制御を行うもの 試行錯誤して作ってみたソースコードは以下のとおりです。 const noble = require("@abandonware/noble"); const TOIO_SERVICE_UUID = "10b20100-5b3b-4571-9508-cf3efcd7bbae"; const MOTOR_CHARACTERISTIC_UUID = "10b20102-5b3b-4571-9508-cf3efcd7bbae"; const motorBuf = Buffer.from("0201013202023278", "hex"); let toio = []; noble.on("stateChange", async (state) => { if (state === "poweredOn") { await noble.startScanningAsync(); } else { await noble.stopScanningAsync(); } }); noble.on("discover", async (peripheral) => { const localName = peripheral.advertisement.localName; if (localName && localName.startsWith("toio Core Cube")) { await noble.stopScanningAsync(); toio.push(peripheral); await peripheral.connectAsync(); peripheral.once("connect", async () => { console.log("connected"); console.log(toio.length); if (toio.length < 6) { await noble.startScanningAsync(); } else { for (const element of toio) { const { characteristics, } = await element.discoverSomeServicesAndCharacteristicsAsync( [TOIO_SERVICE_UUID], [MOTOR_CHARACTERISTIC_UUID] ); await characteristics[0].write(motorBuf); } for (const element of toio) { await element.disconnectAsync(); } } }); } }); 先ほどと動作が異なる部分は以下の部分となります。  ・toio を発見したらスキャンを止める ⇒ peripheral を別途保持してから接続  ・接続処理が行われたら、toio との同時接続数が 6個分になるまでは再度スキャン等の処理を行う  ・同時接続数が 6個になったタイミングで、全ての toio に対して discoverSomeServicesAndCharacteristicsAsync を順番に実行してモーターを動かす処理を実行 またモーター制御用のバイナリデータは、toio の通信仕様のモーターの部分にある「時間指定付きモーター制御」を使っています。また、toio関連の UUID 2つも、以下の仕様に掲載されているものです。  ●モーター · toio™コア キューブ 技術仕様   https://toio.github.io/toio-spec/docs/assets/motor_cube_direction.svg 上記のプログラムを動作させた時の様子は、以下のツイートの動画のとおりです。 自宅にある #toio が 6台に増えた状況なので「6台全てに接続をして、その後 1台ずつモーターの制御をする」というプログラムを書いてみました!開発は Node.js で、ライブラリとして toio.js があるものの、それは使わずに実装してみています(通信仕様に従ったバイナリのやりとりにて)。 pic.twitter.com/381VLMRTGT— you (@youtoy) April 25, 2021 まとめ とりあえず動くものはできましたが、ソースコードはまだ改善すべきところがありそうな予感がします(特に 6台との接続 ⇒ モーターの制御の部分など)。 また、複数の toio と複数の micro:bit に接続した状態で、それらを連携させた処理というのも試せてないので、手をつけられればと思います。 追記: Web Bluetooth API での実装 今回の後半の内容である 6台同時制御を、ブラウザ上で動く JavaScript のプログラム(Web Bluetooth API で実装)でも作ってみました。 ●Web Bluetooth API で toio を 6台同時に制御する - Qiita  https://qiita.com/youtoy/items/2fae3f4365788810215d
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む