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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

9498閲覧

Node-Redのfunctionノードでrequireしたい

s.kun

総合スコア11

Node.js

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/01/25 12:35

編集2018/01/25 12:50

前提・実現したいこと

Node-Redのfunctionノードで他のjsファイルをrequireしたいです。

発生している問題・エラーメッセージ

"TypeError: Cannot read property 'get' of undefined"

該当のソースコード

呼び出したいjsファイル(sensor1.js)

javascript

1exports.get = function() { 2return "test"; 3};

設定ファイル(抜粋)

javascript

1functionGlobalContext: { 2 sensor1:require('./sensors/sensor1.js') 3},

functionノード

javascript

1msg = global.get('sensor1').get(); 2return msg;

試したこと

global.get('sensor1')をcontext.global.get('sensor1')にしましたが、同じでした。

補足情報(FW/ツールのバージョンなど)

Node-Red v0.17.5
Node.js v8.9.4

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

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

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

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

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

miyabi-sun

2018/01/25 12:43

コードは上下の行を```で包むようにしてくださいね。Markdown特有の書き方でコードが読めなくなる可能性があります。
s.kun

2018/01/25 12:50

ご指摘ありがとうございます。コードの表示を修正いたしました。
miyabi-sun

2018/01/25 13:02

ぐっと見やすくなりましたね、対応ありがとうございます!
guest

回答2

0

自己解決

解決できました!
functionノードのコードを

javascript

1var sensor = new global.get('sensor1') 2msg = sensor.get(); 3return msg;

とすることで、期待の動作をさせることができました。
この問題が解決したことで、Node-Redで自作のjavascriptを自由に動作させることが出来るようになります。
ご回答頂いたmiyabi-sunさん、ありがとうございました。

投稿2018/01/26 00:35

s.kun

総合スコア11

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

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

s.kun

2018/01/26 01:41

申し訳ありません。期待の値かと思っていたものが、ソースとは全く無関係に出力されているものでした。色々やっている内に、自作のjavascriptを無視するようになっていたようです。
s.kun

2018/08/27 05:49

PV数が多いので、もしかしたら同じ症状に悩んでいる方がいるかと思い追記。 私の場合は、これは管理者権限で実行していたからでした。 管理者権限で実行する場合としない場合で読み込む設定ファイルが違うようです。
guest

0

Node-Redはあいにく使用していないので、Qiitaの記事を参考に調べてみました。
Node-REDの設定 - Qiita

functionGlobalContext

function nodeの中では他のライブラリをrequireできませんがfunctionGlobalContextであらかじめrequireしておくことでcontext.globalからライブラリにアクセスできるようになります。以下が設定例。

JavaScript

1functionGlobalContext: { 2 jsforce: require('jsforce') 3},

設定ファイルの方は正しく書けているみたいですね。

上記のように設定してfunction nodeで以下のようにしてdebug nodeに吐くとjsforceオブジェクトが格納されていることがわかります。ただしライブラリがnpmでグローバルにインストールされているかsettings.jsより下層にインストールされていなければいけません。

JavaScript

1msg.payload = context.global.jsforce; 2return msg;

ここが引っかかりました。
質問文はmsg = global.get('sensor1').get();ですよね?

Qiitaの記事の書き方に習った場合、
msg = context.global.sensor1.get();になるんじゃないでしょうか?
一度こちらの書き方で試してみてください。

投稿2018/01/25 13:58

miyabi-sun

総合スコア21158

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

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

s.kun

2018/01/26 00:00

ご回答ありがとうございます。早速試してみたのですが、状況が変わりませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問