2016-05-03 14 views
0

私はしばらくの間このアプリケーションで作業してきました。私は、すべてうまく動作する他のいくつかのモジュールを持っています。私はこの特定のモジュールで何度も問題を抱えていて、それは非常に苛立っています。この問題は非常に単純です。たぶん私はそれを考えています。うまくいけば、誰かが私がいると言うでしょう。 :)Sails.jsモデルメソッド(非インスタンス)

このモジュールでは、私のモデルからメソッドを使用することに決めました。この特定のものはインスタンス化されていません。 『壊した』

var accountName = Account.numberToName(params.id); 

ACCOUNTNAMEの値はこの時点で:

/* 
* Account.js 
*/ 

module.exports = { 

    connection: 'islMongo', 

    attributes: { 
    name: { 
     type: 'string', 
     required: true, 
    }, 
    }, 

    numberToName: function(accountNumber) { 
    Account.findOne(accountNumber).exec(function(err, a){ 
     if (err) { 
     return 'err'; 
     } else { 
     return 'ok'; 
     } 
    }); 
    return 'broke'; 
    }, 
}; 

私はこのような私のコントローラのいずれかから、それを呼び出す:ここに私のモデルです。私はなぜそれが "間違って"または "ok"を返さないのか理解していない。実際の機能をテストのために簡略化しました。

編集

私は正常に動作し、他の電話を持っています。例えば:

Account.updateBalance(params.account, -2000); 

定義がコールバックを持っていますが、それが必要とされていないので、私は実際には1つを使用していない:

updateBalance: function(account, amount, callback) { 
    /* Accepts account id or account object */ 
    (function _lookupAccount(afterLookup) { 
     if (typeof account === 'object') return afterLookup(null, account); 
     Account.findOne(account) 
     .exec(afterLookup); 
    })(function (err, a) { 
     if (err) return callback(err); 
     if (!a) { 
     err = new Error(); 
     err.message = "Couldn't find account."; 
     err.status = 400; 
     return callback(err); 
     } 
     a.balance = parseInt(a.balance) + parseInt(amount); 
     a.save(callback); 
    }); 
    }, 

は、このように呼ばれています。メソッドは正常に動作します。

Sails.js documentationには、コールバックを使用しないメソッドの例があります。彼らは単に要求されたデータを返します。

// Attribute methods 
getFullName: function(){ 
    return this.firstName + ' ' + this.lastName; 
}, 
isMarried: function() { 
    return !!this.spouse; 
}, 
isEligibleForSocialSecurity: function(){ 
    return this.age >= 65; 
}, 
encryptPassword: function() { 

} 

そして、このように呼ばれる:

if (rick.isMarried()) { 
    // ... 
} 

私はこの記事の上部にある私の方法をどうしようとしていますものです。 exec()部分のAccount.findOne()が呼び出されていないようです。

答えて

1

Sails.js & Node.jsは非同期です。だから簡単な言葉で彼らはデータベースからの応答を待つことはありませんが、彼らは日付を得たときにコールバックを呼び出します。だから、Queries and callbacksについて読む必要があり、callback hellとは何ですか(これは決して行うべきではありません)。

これで問題に戻ります。

/* 
Account.js 
*/ 
//... 

numberToName: function(accountNumber, callback) { 
    // if you want some additional logic you can create function here and call callback in it 
    Account.findOne(accountNumber).exec(callback); 
} 

//... 

ヒント:コールバックの最初のパラメータは常にエラーです。

// AccountController 

method: function(req, res){ 
    var id = req.param('id'); // if its int you should parseInt() 
    var callback = function(error, account){ 
     if(error) 
      res.send('error'); 
     else 
      res.send(account.name); 
    }; 

    Account.numberToName(id, callback); 
} 
+0

ご返信ありがとうございます。私の元の記事を読んでください。私はいくつかの編集をしました。 – sirEgghead

+0

メソッドは、非同期でない場合にreturnを使用できます。すべてのDBメソッドはupdateBalanceのようにコールバックを使用する必要があります。これは、ノードと他のプログラミング言語のコアとなる違いです。 sails.log(err、a)のようなコードにデバッグを追加すると、実行されているかどうかがわかります。このようなメソッドの書き込みは常に '破損'を返します – Bonanza

+0

興味深い。追加のご協力ありがとうございます。私はあなたのコールバック地獄のリンクを徹底的に読んでいます。 :) – sirEgghead

関連する問題