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

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

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

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

Q&A

解決済

1回答

2465閲覧

module.exportsをファイルの先頭に記述したい

yasu_atsu_2016

総合スコア17

Node.js

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

0グッド

0クリップ

投稿2016/11/21 20:03

編集2016/11/21 20:12

###前提・実現したいこと
nodejsで自作モジュールを作成し、module.exportsをファイルの先頭に
記述しようとしています。
module.exportsをファイルの末尾に記述する場合はうまく動くのですが、
その記述をファイルの先頭に持ってきたらエラーが発生してしまいました。
module.exportsをファイルの先頭に記述する場合、どのように修正すればよいでしょうか?
間違っていた原因は何でしょうか?

node.jsのバージョン :v4.6.1
OSのバージョン :fedora 24 x64

###試したこと
課題に対してアプローチしたことを記載してください
main.js:(module.exportsをsub.jsの末尾に記述した場合)

var wkcls = require('./sub.js');
objA = new wkcls('test desu');
objA.m01();

sub.js(module.exportsをsub.jsの末尾に記述した場合)

var cls = function(arg){
this.p01 = arg;
}

cls.prototype.m01 = function(){
console.log(this.p01);
}
module.exports = cls;

実行結果(module.exportsをsub.jsの末尾に記述した場合)

node main.js
test desu
(→うまく動きました。)

main.js:(module.exportsをsub.jsの先頭に記述した場合)

var wkcls = require('./sub.js');
objA = new wkcls('test desu');
objA.m01();

sub.js(module.exportsをsub.jsの先頭に記述した場合)

module.exports = cls;
var cls = function(arg){
this.p01 = arg;
}

cls.prototype.m01 = function(){
console.log(this.p01);
}

実行結果(module.exportsをsub.jsの先頭に記述した場合)

node main.js
/home/xxx/main.js:3
objA = new wkcls('test desu');
^

TypeError: wkcls is not a function
at Object.<anonymous> (/home/xxx/main.js:3:8)
at Module._compile (module.js:409:26)
at Object.Module._extensions..js (module.js:416:10)
at Module.load (module.js:343:32)
at Function.Module._load (module.js:300:12)
at Function.Module.runMain (module.js:441:10)
at startup (node.js:139:18)
at node.js:974:3
(→うまく動きませんでした。)

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

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

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

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

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

guest

回答1

0

ベストアンサー

先頭でmodule.exports = cls;と書いてしまうと、この時点でclsが定義されていませんのでエラーとなります。

どうしても先頭に書きたければ、こんな方法もあります。

javascript

1module.exports = (function(){ 2 var cls = function(arg){ 3 this.p01 = arg; 4 } 5 6 cls.prototype.m01 = function(){ 7 console.log(this.p01); 8 } 9 10 return cls; 11})(); 12

投稿2016/11/21 22:12

maisumakun

総合スコア145121

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

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

yasu_atsu_2016

2016/11/22 03:35

教えていただいたコードをsub.jsに保存して実行してみたところ、うまくいきました。 ありがとうございます。module.exportsにfunctionをごっそりいれられるんですね。 自分でも調べていたのですが、以下のソースを参考に自分でもsub.jsを改良していました。 (https://github.com/socketio/socket.io/blob/master/lib/client.js) module.exports = cls; //var cls = function(arg){ function cls(arg){ this.p01 = arg; } cls.prototype.m01 = function(){ console.log(this.p01); } そうしたところ、module.exportsを先頭に書いて、clsが定義されていない状態でも 動くようになりました。ただ、なぜこれで動くのかがわからない、という疑問が またわいてきて、まだもやもやしている状態です。 質問がずれてしまっているかもしれませんんが、私のお勉強にお付き合いいただける方は 「 function cls(arg){」という書き方だとなぜうまくいくのか教えてください。
yasu_atsu_2016

2016/11/27 20:37

記述方法がいろいろあると勉強になりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問