- 投稿日:2021-01-21T23:36:44+09:00
node.jsで集計処理をしてみた。
初めに
node.js の学習のために集計をしてみました。
実際のコードです。
https://github.com/shohei-lob/adding-up.git環境はLinuxです。
今回すること
「2010 年から 2015 年にかけて 15〜19 歳の人が増えた割合の都道府県ランキング」作成。
地域経済分析システム(RESAS:リーサス)で提供されている2010 年と 2015 年の都道府県別 10 代の人口データを集計していきます。データはCSV方式のものです。
要件定義
1.ファイルからデータを読み取る
2.2010 年と 2015 年のデータを選ぶ
3.都道府県ごとの変化率を計算する
4.変化率ごとに並べるファイルからデータを読み取る
app.js'use strict'; //ファイルを読み込む const fs = require('fs'); const readline = require('readline'); const rs = fs.createReadStream('.hoge.csv'); const rl = readline.createInterface({ input: rs, output: {} }); rl.on('line', lineString => { console.log(lineString); });以下部分が理解するのに苦しみました
rl.on('line', lineString => { console.log(lineString); });部分が理解するのに苦しみました。公式ドキュメントにもあるようにlineが呼ばれるたびに第二引数"lineString"が呼ばれる。
2010 年と 2015 年のデータを選ぶ
app.jsrl.on('line', lineString => { const columns = lineString.split(','); const year = parseInt(columns[0]); const prefecture = columns[1]; const popu = parseInt(columns[3]); if (year === 2010 || year === 2015) { console.log(year); console.log(prefecture); console.log(popu); } });1行ずつ理解していきます。
lineStringで与えられた文字列をカンマで分割しcolumnsに代入。
const columns = lineString.split(',');集計年(0 番目),都道府県(1 番目),15〜19 歳の人口(3 番目)をそれぞれ変数に保存しています。
parseInt()は、年と人口を整数値にしています。const year = parseInt(columns[0]); const prefecture = columns[1]; const popu = parseInt(columns[3]);もし年が、2010または2015の場合出力。
if (year === 2010 || year === 2015) { console.log(year); console.log(prefecture); console.log(popu); }都道府県ごとの変化率を計算する
集計データは以下3つになる。
・2010 年の人口の合計
・2015 年の人口の合計
・計算された 2015 年の 2010 年に対する変化率
連想配列とオブジェクトの2つのデータ型を使い集計データを表す。今回はmapを使います。
app.js'use strict'; const fs = require('fs'); const readline = require('readline'); const rs = fs.createReadStream('.hoge.csv'); const rl = readline.createInterface({ input: rs, output: {} }); const prefectureDataMap = new Map(); // key: 都道府県 value: 集計データのオブジェクト rl.on('line', lineString => { const columns = lineString.split(','); const year = parseInt(columns[0]); const prefecture = columns[1]; const popu = parseInt(columns[3]); if (year === 2010 || year === 2015) { let value = prefectureDataMap.get(prefecture); if (!value) { value = { popu10: 0, popu15: 0, change: null }; } if (year === 2010) { value.popu10 = popu; } if (year === 2015) { value.popu15 = popu; } prefectureDataMap.set(prefecture, value); } }); rl.on('close', () => { console.log(prefectureDataMap); });以下集計されたデータを格納する連想配列です。
const prefectureDataMap = new Map(); // key: 都道府県 value: 集計データのオブジェクト以下コードは連想配列 prefectureDataMap からデータを取得しています。
value の値が Falsy の場合に、value に初期値となるオブジェクトを代入します。
changeが null の理由は変化率が0の可能性があるからです。let value = prefectureDataMap.get(prefecture); //都道府県のデータをとる if (!value) { // データが取れてない時 value = { popu10: 0, // 2010年の人口 popu15: 0, // 2015年の人口 change: null //変化率 }; }全ての行を読み終えた時'close'を呼び出す。
rl.on('close', () => { console.log(prefectureDataMap); }まとめ
APIの使い方を理解していきたいです。
データの型をきっちりしないとエラーが起きる。
- 投稿日:2021-01-21T21:05:51+09:00
corrs について 猿でもわかる
バックエンド側でnode,expressを触っている人向け
CORRS とは、API通信で値(param)など、バックエンド側のデータを表示させるために
バックエンド側で設定するための物です。なので、今回は設定方法だけ記載します。
これを書いておけばHTTP通信は正常に行われます。
バックエンド側に
app.use((req, res, next) => {
// res.header("Access-Control-Allow-Origin", "http://localhost:4200");
res.header("Access-Control-Allow-Origin", req.headers.origin);
res.header("Access-Control-Allow-Headers", "Origin, Authorization, Accept, Content-Type");
// res.header("Access-Control-Allow-Headers", "*");
res.header('Access-Control-Allow-Credentials', "true");// OPTIONSリクエスト(プリフライトリクエスト)への応答 // 参考: https://developer.mozilla.org/ja/docs/Web/HTTP/CORS#preflighted_requests if (req.method == "OPTIONS") { res.send(200); } else { next(); }});
今回はAngularを使っている方向けです。
指摘がありましたら、コメント等お願いします。
- 投稿日:2021-01-21T16:26:23+09:00
Slackの今日のチャンネル内容をLINEに送信する(Google Cloud Functions)
表題の内容を試す機会があったので、作業内容とサンプルコードを紹介したい思います。
環境
- Slack: フリープランでOK
- LINE
- GCP Coud Functions
- 実行環境はNode.js
*各サービスのドキュメントはすでにネットに豊富にあるので、今回は細かい設定方法の解説を省きます
サービス設定
Slack
slack api 設定
https://api.slack.com/apps で
Create New App
から新規appを作成。その後以下を設定。
Features -> OAuth & Permissions でBot Token Scopesに以下の権限を付与
channels:history
chat:write
commands
groups:history
im:history
mpim:history
users:read
Features -> OAuth & Permissions -> OAuth Tokens & Redirect URLs ->
Install to Workspace
ボタンをクリック
Bot User OAuth Access Token [xoxb-**...] を取得。後ほど利用するSettings -> Basic Information -> Signing Secretを
show
で一時的に表示してメモ。後ほど利用する情報を取得したいチャンネルのidを取得する
こちらの記事が参考になると思います。
対象チャンネルに上記で作成したappを追加
LINE
LINE Notifyを使用します。トークンを発行し、送信先トークルームにLINE notifyを招待します。
こちらの記事が参考になると思います。Cloud Functions実装
デプロイの手法は複数あると思いますが、webインターフェースを用いた手法だとこちらが参考になると思います。
コードはこちらのリポジトリに置きました。
https://github.com/hisa-shimoji/SlackTodayCh2Line今回のデプロイの際は
- トリガーのタイプ: http
- 認証: "認証が必要"
を選択します。ランタイム環境変数に以下の値を設定します。
変数名 解説 SLK_BOT_TOKEN slack設定時に確認した Bot User OAuth Access Token [xoxb-**...] の値 SLK_BOT_SIGN_SECRET slack設定時に確認したSigning Secretの値 SLK_BOT_MONITOR_CHANNEL slack設定時に確認した対象チャンネルのid L_NOTIFY_KEY LINE notifyのトークン L_MSG_PREFIX LINEメッセージの前に付加する文字列 改行は\nで設定 必要なければ空白に L_MSG_SUFFIX LINEメッセージの後に付加する文字列 改行は\nで設定 必要なければ空白に 実行テスト
デプロイ後、webインターフェースから
関数をテストする
でテストできます。
成功すると該当slackチャンネルの当日分のメッセージ(発言者と内容)がLINEへ送信されます
定期実行
GCP Cloud Schedulerを用いて定期実行が可能です。 こちらの記事が参考になると思います。
参考情報
https://cloud.google.com/functions/docs/quickstart-nodejs?hl=ja
https://qiita.com/YumaInaura/items/0c4f4adb33eb21032c08
https://qiita.com/iitenkida7/items/576a8226ba6584864d95
https://qiita.com/nirasan/items/0d9aad7da324ecd789f4
- 投稿日:2021-01-21T14:47:24+09:00
sam local start-apiでヘッダーが勝手にキャメルケースになるんだが?
表題の通り、sam local start-apiでヘッダーが勝手にキャメルケースになる問題についてです。
こちらにドンピシャの回答があるのですが、内部で使っているFlaskの仕様だそうです。
Headers are received in Camel-Case · Issue #1860 · aws/aws-sam-cli仕方ないのでNode.jsでは下記ワークアラウンドをしてヘッダーをすべて小文字にして対応しましょう。
(Pythonならissueのコメントにサンプルコードが載っています)const toLowerCaseKey = function(object) { let newObject = {}; for (let key in object) { if (object.hasOwnProperty(key)) { newObject[key.toLocaleLowerCase()] = object[key]; } } return newObject }
- 投稿日:2021-01-21T12:34:38+09:00
【フロントエンド開発】初投稿
- 投稿日:2021-01-21T12:32:44+09:00
Azure IoT Hub の イベントハブ互換エンドポイントに Node.js で subscribe
次のプログラムを改造して、イベントハブ互換エンドポイントを使うようにしました。
Azure IoT Hub に Node.js で subscribe
Hub に subscribe しているので、その Hub 内の Device に届いた総てのメッセージが表示されます。Device の認証が、SAS トークンでも、CA 証明書でも、どちらも表示されます。azure_endpoint_subscribe.js#! /usr/bin/node // --------------------------------------------------------------- // azure_endpoint_subscribe.js // // Jan/21/2021 // // --------------------------------------------------------------- 'use strict' const dotenv = require('dotenv') const { EventHubConsumerClient } = require("@azure/event-hubs"); dotenv.config() const endpoint_connectionString = `${process.env.ENDPOINT}` var printError = function (err) { console.log(err.message) }; var printMessages = function (messages) { for (const message of messages) { console.log("Telemetry received: ") console.log(JSON.stringify(message.body)) console.log("") /* console.log("Properties (set by device): "); console.log(JSON.stringify(message.properties)); console.log("System properties (set by IoT Hub): "); console.log(JSON.stringify(message.systemProperties)); console.log(""); */ } } // --------------------------------------------------------------- async function main() { console.error("*** azure_endpoint_subscribe.js *** start ***") const clientOptions = { } const consumerClient = new EventHubConsumerClient("$Default", endpoint_connectionString, clientOptions) consumerClient.subscribe({ processEvents: printMessages, processError: printError, }) } main().catch((error) => { console.error("Error running sample:", error) }) // ---------------------------------------------------------------.envENDPOINT="Endpoint=sb://ihsuprodkwres017dednamespace.servicebus.windows.net/;SharedAccessKeyName=iothubowner;SharedAccessKey=vL1ze1abcdefgh48cMK7l6nv6+o37k2s9F70SD+LLZUs=;EntityPath=iothub-ehub-iot-bb-344012-58f0012d36"Azure Portal で エンドポイントの値を取得
- 投稿日:2021-01-21T02:24:59+09:00
2021年、gulp-sassをインストールしようとして躓いた
この度完全新規のコーディング案件に携わることになったため、久しぶりに1年前まで使用していたpackage.jsonを引っ張りだし
npm intall
を実行したところ、gulp-sassのインストールでエラーを吐いてしまい躓きました。
3時間調査したり悩んだりした結果、解決しましたので備忘録として残します。エラー状況
Windows10環境で
npm install gulp-sass --save-dev
すると、下記の通りログが出力され、インストールできない。
私のPCにはNode.jsの【最新版(v15.5.0)】がインストールされておりました。エラーのログ
cmdPS G:\data\html> npm install gulp-sass --save-dev npm WARN deprecated fsevents@1.2.13: fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2. > node-sass@4.14.1 install G:\data\html\node_modules\gulp-sass\node_modules\node-sass > node scripts/install.js Downloading binary from https://github.com/sass/node-sass/releases/download/v4.14.1/win32-x64-88_binding.node Cannot download "https://github.com/sass/node-sass/releases/download/v4.14.1/win32-x64-88_binding.node": HTTP error 404 Not Found Hint: If github.com is not accessible in your location try setting a proxy via HTTP_PROXY, e.g. export HTTP_PROXY=http://example.com:1234 or configure npm proxy via npm config set proxy http://example.com:8080 > node-sass@4.14.1 postinstall G:\data\html\node_modules\gulp-sass\node_modules\node-sass > node scripts/build.js Building: C:\Program Files\nodejs\node.exe G:\data\html\node_modules\node-gyp\bin\node-gyp.js rebuild --verbose --libsass_ext= --libsass_cflags= --libsass_ldflags= --libsass_library= gyp info it worked if it ends with ok gyp verb cli [ gyp verb cli 'C:\\Program Files\\nodejs\\node.exe', gyp verb cli 'G:\\data\\html\\node_modules\\node-gyp\\bin\\node-gyp.js', gyp verb cli 'rebuild', gyp verb cli '--verbose', gyp verb cli '--libsass_ext=', gyp verb cli '--libsass_cflags=', gyp verb cli '--libsass_ldflags=', gyp verb cli '--libsass_library=' gyp verb cli ] gyp info using node-gyp@3.8.0 gyp info using node@15.5.0 | win32 | x64 gyp verb command rebuild [] gyp verb command clean [] gyp verb clean removing "build" directory gyp verb command configure [] gyp verb check python checking for Python executable "python2" in the PATH gyp verb `which` failed Error: not found: python2 gyp verb `which` failed at getNotFoundError (G:\data\html\node_modules\which\which.js:13:12) gyp verb `which` failed at F (G:\data\html\node_modules\which\which.js:68:19) gyp verb `which` failed at E (G:\data\html\node_modules\which\which.js:80:29) gyp verb `which` failed at G:\data\html\node_modules\which\which.js:89:16 gyp verb `which` failed at G:\data\html\node_modules\isexe\index.js:42:5 gyp verb `which` failed at G:\data\html\node_modules\isexe\windows.js:36:5 gyp verb `which` failed at FSReqCallback.oncomplete (node:fs:199:21) gyp verb `which` failed python2 Error: not found: python2 gyp verb `which` failed at getNotFoundError (G:\data\html\node_modules\which\which.js:13:12) gyp verb `which` failed at F (G:\data\html\node_modules\which\which.js:68:19) gyp verb `which` failed at E (G:\data\html\node_modules\which\which.js:80:29) gyp verb `which` failed at G:\data\html\node_modules\which\which.js:89:16 gyp verb `which` failed at G:\data\html\node_modules\isexe\index.js:42:5 gyp verb `which` failed at G:\data\html\node_modules\isexe\windows.js:36:5 gyp verb `which` failed at FSReqCallback.oncomplete (node:fs:199:21) { gyp verb `which` failed code: 'ENOENT' gyp verb `which` failed } gyp verb check python checking for Python executable "python" in the PATH gyp verb `which` succeeded python C:\Documents and Settings\●●●\AppData\Local\Programs\Python\Python39\python.EXE gyp ERR! configure error gyp ERR! stack Error: Command failed: C:\Documents and Settings\●●●\AppData\Local\Programs\Python\Python39\python.EXE -c import sys; print "%s.%s.%s" % sys.version_info[:3]; gyp ERR! stack File "<string>", line 1 gyp ERR! stack import sys; print "%s.%s.%s" % sys.version_info[:3]; gyp ERR! stack ^ gyp ERR! stack SyntaxError: invalid syntax gyp ERR! stack gyp ERR! stack at ChildProcess.exithandler (node:child_process:333:12) gyp ERR! stack at ChildProcess.emit (node:events:376:20) gyp ERR! stack at maybeClose (node:internal/child_process:1063:16) gyp ERR! stack at Process.ChildProcess._handle.onexit (node:internal/child_process:295:5) gyp ERR! System Windows_NT 10.0.19042 gyp ERR! command "C:\\Program Files\\nodejs\\node.exe" "G:\\data\\html\\node_modules\\node-gyp\\bin\\node-gyp.js" "rebuild" "--verbose" "--libsass_ext=" "--libsass_cflags=" "--libsass_ldflags=" "--libsass_library=" gyp ERR! cwd G:\data\html\node_modules\gulp-sass\node_modules\node-sass gyp ERR! node -v v15.5.0 gyp ERR! node-gyp -v v3.8.0 gyp ERR! not ok Build failed with error code: 1 npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.2.7 (node_modules\chokidar\node_modules\fsevents): npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.13: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"}) npm WARN GulpTask@1.0.0 No description npm WARN GulpTask@1.0.0 No repository field. npm ERR! node-sass@4.14.1 postinstall: `node scripts/build.js` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the node-sass@4.14.1 postinstall script. npm ERR! This is probably not a problem with npm. There is likely additional logging output above. npm ERR! A complete log of this run can be found in: npm ERR! C:\Documents and Settings\●●●\AppData\Roaming\npm-cache\_logs\2021-01-20T16_23_09_981Z-debug.logdebug.logを確認すると同じエラーが出力されておりました。
Pythonが必要そうなログが出ているのでインストールしたり、npmのキャッシュを消して再インストールし直したり…
検索して出てきたものを片っ端から試しましたが直りません。
なんとなく、「どうもnode-sassが悪いっぽい」ということだけ情報を掴みました。解決策
Node.jsのバージョンを【推奨版】にダウングレードしました。
(Node.jsをアンインストール → 公式サイトから左側の「推奨版」をダウンロード&インストール)
これだけで無事gulp-sassをインストールすることができました。
原因
なぜダウングレードするだけで解決したのか?
原因はgulp-sass内で使用しているnode-sassにありました。
- node-sassの最新バージョンはv5.0.0(これはNode.js v15.x に対応しています)
- gulp-sass(v3.2.1)で使用しているnode-sassはv4.14.1。これはNode.js v14.x までしか対応していません
node-sassがどのNode.jsのバージョンに対応しているか?はGithubのReleaseを開くと確認できます。
https://github.com/sass/node-sass/releases
バージョンに注意!
今まで「最新こそ正義」と思い最新版を入れてきましたが、こんな落とし穴があるとは思いませんでした。
どのソフトなどを使用していてもそうですが、自分が使うパッケージに合わせてインストールするバージョンを選ぶか、使うパッケージが最新版に追いついていないのであれば代替のものを探すことが大事ですね。
- 投稿日:2021-01-21T01:31:42+09:00
Node.jsのmodule.exportsの仕組みを理解する
はじめに
こちらは、エンジニアの新たな学びキャンペーンに向けた記事となります。
Node.js + Express で作る Webアプリケーション 実践講座を参考にしながら、
module.exports
について理解を深めたことを記事にします。実行環境
- Node.js v12.16.3
- Express 4.16.1
- 10.4.11-MariaDB
本記事の概要
私は今現在、Webアプリケーションの開発をしていますが、ある問題を抱えています。
その問題とは、1つのファイル内のソースコードが膨らみすぎて可読性が落ちているというものです。
これはデータベースへの接続、ミドルウェアの呼び出し、レスポンスの処理内容など、あらゆる情報をapp.js
内に書き込んでいることに由来します。そこで、
app.js
内のソースコードを削減することを目的に、
データベース接続を行う関数を別ファイルdbConnect.js
に記述し、
module.exports
を使ってそれをapp.js
から呼び出すようにリファクタリングしました。本記事では、はじめに
module.exports
について例題を用いて解説し、
その後で応用として、データベース接続用の関数をmodule.exports
を使って呼び出します。対象のUdemy講座で学んだこと
対象の講座で学んだことのうち、特に本記事へと反映する内容は以下となります。
module.export
の使い方require
の使い方module.exportsとは
JavaScript(Node.js)において、
あるファイルに存在する変数や関数を、別のファイルで実行する機能です。似たようなものに
exports
がありますが、本記事では触れません。(例) sub.js内の関数をmain.jsで実行する
sub.js
で宣言した変数をmain.js
で実行します。(*
var
やlet
ではなくconst
で宣言しているので、厳密には変数ではなく定数です。)main.jsconst foo = require("./sub.js");// sub.jsからmodule.exportsで指定した変数を読み込み、変数fooに代入する foo("bee"); // beesub.jsconst hoge = function(bar){ console.log(bar); } module.exports = hoge; // main.jsからrequireされたら、hogeという変数を渡す(実践) データベース接続用の関数を、別ファイルに配置する
app.js
にすべてのソースコードを書き込んでいた状態から、
app.js
とdbConnect.js
の2つにソースコードを分割します。リファクタリング前のソースコード
app.jsconst express = require("express"); const app = express(); const mysql = require("mysql"); const dbcn = mysql.createConnection({ host:"localhost", user:"root", password:"1234", database:"idea" }) app.set("view engine", "ejs"); app.get("/", (req, res)=>{ const sql = "select * from ideatext"; dbcn.query(sql, function (err, result, field){ if(err) throw err; console.log(result); res.render("index", {idea : result}); }) }) app.listen(3000);リファクタリング後のソースコード
app.jsconst express = require("express"); const app = express(); const mysql = require("mysql"); const dbcn = require("./dbConnect.js") const connection = dbcn.dbcn; app.set("view engine", "ejs"); app.get("/", (req, res)=>{ const sql = "select * from ideatext"; dbcn.query(sql, function (err, result, field){ if(err) throw err; console.log(result); res.render("index", {idea : result}); }) }) app.listen(3000);dbConnect.jsconst mysql = require("mysql"); const dbcn = mysql.createConnection({ host:"localhost", user:"root", password:"1234", database:"idea" }) module.exports= dbcn;参考
- 投稿日:2021-01-21T00:23:06+09:00
MQTTによるIoT制御を無料でやってみる
前置き
※途中まで頑張りましたが、断念したため供養記事となります。m..m
背景
IoTの制御としてArduino, Raspberry Piなどを用いて各種センサー情報を収集、又はアクチュエータの制御などを想定する。
MQTTとは
- ネットワークプロトコルの一種
- HTTPと比較すると以下が特徴的
- 一対多, 多対多で情報のやりとりが可能
- リアルタイムでの通信が可能
- ヘッダー情報が少なくHTTPの10分の1と軽量 など
詳細はIBMのサイトに記載されています。
MQTT の基本知識基本的に Subscriber(受け手), Publisher(送り手), Broker(中継点)の3者で構成します。
Brokerにはtopicと呼ばれるパスを設定し、Sub,Pub共に共通のtopicで送受信を行います。
例: Publish =(topic: hoge)=> Subscribe
topicはhoge/bar, hoge/hoge など"/"を用いて階層化することができます。
topicを分けることで任意のクライアント同士で情報のやり取りを行います。
MQTTを利用するにあたってはBrokerを構築する必要があります。
手早く無料で利用するには(制約がありますが)いくつかのサービスが利用できます。構成図
今回は Beebotte と Heroku を組み合わせた場合を紹介します。
- Beebotte を利用するメリット
- 接続台数が無制限
- メッセージが一日あたり5万件送信できる
- メッセージを一日あたり5千件保存できる
- SSL接続が可能
- デメリット
- 中継点にアプリケーションが乗せられない
- topicの管理がやや複雑(channel / resource の形。生成、削除にAPIを叩く必要がある) 接続台数と送信可能件数が魅力的ですが、BrokerにDBを接続したり、メッセージによって特定の処理を行いたい場合は工夫が必要です。
そこでHerokuをSubscriber, PublisherとしてBeebotteに接続することで擬似的に実現します。
HerokuはPaaSなのでBrokerとして利用できますが、無料だと5台までしか接続できません。
実装
環境
- Mac
- node.js v8.12.0 (npm v6.4.1)
- git v2.14.3 (Apple Git-98)
環境構築
Brokerとトピックの開設
- Beebotte のサイトでアカウント登録
- Control Panel > Channels > Create New
- Channel Name, Description と Resource Name, Description を入力し Create channel
- 今回の例: ChannelName: TestCh, ResourceName: Hoge
- Channels > Channel Name > Channel Token を確認(チャンネル毎に別)
- Control Panel > Account Settings > Access Management > API Key, Secret Key を確認
Beebotteの場合 トピック名は "ChannelName / ResourceName" です
MQTT クライアントの実装
Beebotteからライブラリが提供されている他、MQTT.jsや他の言語のライブラリ1でも可能です。
Tutorialsから実装例が紹介されています
今回はMQTT.jsを用いた例を紹介しますプロジェクトを作成するディレクトリで
npm install mqtt --saveSubscriber
メッセージを受信する
トピックを開設した際に確認したChannel Token と トピック名を書き換えてくださいsubscriber.jsconst mqtt = require('mqtt') const CHANNEL_TOKEN = '*********************' const client = mqtt.connect('mqtt://mqtt.beebotte.com', {username: 'token:' + CHANNEL_TOKEN, password: ''} ) const onMessageCallback = (topic, message) => { console.log(topic + ' ' + message) } client.on('message', onMessageCallback) client.subscribe('TestCh/Hoge')Publisher
メッセージを発信する
インターバルで定期的に送ってます。publisher.jsconst mqtt = require('mqtt') const CHANNEL_TOKEN = '*********************' const client = mqtt.connect('mqtt://mqtt.beebotte.com', {username: 'token:' + CHANNEL_TOKEN, password: ''} ); setInterval(function() { const message = 'Hello, world!' client.publish('TestCh/Hoge', message) }, 1000);2つのターミナルで動作確認してみます
node publisher.jsnode subscriber.js #TestCh/Hoge Hello, world! #TestCh/Hoge Hello, world! #...メッセージが表示されていればうまく送信、受信できています。
Heroku 編
志半ばで筆を投げました。すみません。