2017-09-07 13 views
0

私はすべてのモジュールを管理するためにModulesManagerを作成しました。したがって、私は "server.js"の先頭に大きな要件リストを持っていません私はマネージャのメソッドにアクセスしようとしています。私のサーバーがクラッシュし、マネージャメソッドが関数ではないというエラーがスローされます。私はここで間違ってやって本当にわからないんだけどmodule.exportsは関数を持つオブジェクトをエクスポートしません

TypeError: moduleManager.sqlString is not a function 

が、これは私は答えをオンラインで見て試してみたが、誰もが何か違うと何も仕事を言っている、愚かなエラーの可能性があります。

モジュールマネージャー(manager.js):

const sqlSetup = require("./sqlSetup.js"); 
const sqlSafeString = require("./sqlString.js"); 

function Manager(){ 
    this.sqlString = function(query){ 
     return sqlSafeString.getSqlSafeString(query); 
    }, 
    this.sql = function(){ 
     return sqlSetup; 
    } 
} 
module.exports = Manager; 

モジュールSQL(sqlSetup.js):

const SqlString = require('sqlstring'); 

function getSqlSafeString(query){ 
    //format query to fit in MySQL 
    var format = SqlString.escape(query); 
    return format; 
} 
module.exports = getSqlSafeString; 

これは私のトラヴィスのためのテストで、私が作るしようとしていることを築きますモジュールマネージャのパスは良いですが、問題は実際に私が理解していない "ModuleManager.js"にあります...

require('dotenv').config(); 
const Discord = require("discord.js"); 
const client = new Discord.Client(); 
const token = process.env.MOISTY; 
const moduleManager = require("../modules/manager.js"); 
const assert = require("assert"); 

console.log("MAKE SURE MOISTY IS OFFLINE!"); 

client.login(token); 

client.on('ready',() => { 
    //confirm login 
    console.log("MOISTY:200"); 

    //Assert 
    assert.deepEqual(moduleManager.sqlString("sample text"), "sample test"); 

    //terminate the session 
    process.exit(); 
}); 

私はverではありませんこれは簡単な質問かもしれません...

+0

あなたのコードを 'module.exports = new Manager();'に変更した後、エラーが 'TypeError:moduleManager.sqlStringが関数ではない'であることを確かめていますか?私はそれが 'TypeError:sqlSafeString.getSqlSafeStringは関数ではない'であると確信しています。 –

+0

@ t.nieseあなたは正しいです!私はいつもインスタンスを作成する必要があるからですか?これは感謝しています! – MathieuAuclair

+0

いいえ、私は答えの両方の問題を説明しました。とにかく、あなたはあなたの答えを新しい問題に更新するべきではありません。そうしないと、以前のすべての答えが間違っています。 –

答えて

0

コードに複数の間違いがあります。

module.exports = getSqlSafeString;は、exportgetSqlSafeStringに設定します。

require("./sqlString.js")を入力するとexportsに割り当てられた値が得られますので、getSqlSafeStringに割り当ててください。だから、

あなたが書くとその機能にアクセスしたい場合:

const getSqlSafeString = require("./sqlString.js"); 
//... 
return getSqlSafeString(query);` 

module.exports = Manager;は機能Managerではなく、タイプManagerのオブジェクトをエクスポートし、そのmoduleManager.sqlStringManager.sqlStringに等しくなります。あなたが本当にのオブジェクトで作成を行いたい場合は

module.exports = { 
    sqlString : function(query){ 
     return sqlSafeString.getSqlSafeString(query) 
    }, 
    sql : function(){ 
     return sqlSetup 
    } 
}; 

:あなたが唯一のグループに1つのオブジェクト内の関数を使用する場合は、あなたがそのように書く必要がありますので、その後、コンストラクタを使用して、とにかくここではあまり意味がありませんタイプManagerは、あなたが記述する必要があります。

module.exports = new Manager 
0

requireモジュールAのモジュールBから何かをエクスポートするには、そのモジュールAでエクスポートする必要があります。 〜module.exports

問題がManagerをマネージャモジュールにエクスポートしていません。

const moduleManager = require("../modules/manager.js"); 
... 
moduleManager.sqlString("sample text") 

その後インスタンスをエクスポートする必要があります。

あなたはManagerのインスタンスを使用しているように見えるので、簡単な輸出Managerはできましたが、。 manager.js

module.exports = new Manager(); 
+0

申し訳ありません私の記事の1行を忘れてしまいましたが、編集しましたが、新しいキーワードを追加して動作するかどうかを確認します。 – MathieuAuclair

+0

新しいキーワードと "()"でも動作しません投稿を更新します – MathieuAuclair

+0

私はここで試しましたが、 'module.exports = new Manager();'が動作しました。あなたは何か他のことをしているに違いない。 – acdcjunior

0

あなたは、インスタンス上の機能を入れている、すなわちthis.sqlStringManagerのインスタンスにsqlStringという名前のプロパティです。しかし、あなたはnew Manager()をやったり、あなたのケースではないつまり、コンストラクタとしてManagerを使用していないnew moduleManager()

あなたは

const moduleManager = new require("../modules/manager.js")(); 

の下に好きかにエクスポートを変更するには、インポートコードを変更することができます。

module.exports = new Manager(); 

moduleManagerManagerのインスタンスになり、使用できるようになりますmoduleManager.sqlString

関連する問題