2016-05-03 8 views
0

Ich arbeite seit einiger Zeit an dieser App. Ich habe mehrere andere Module, die alle gut funktionieren. Ich habe eine Menge Ärger mit diesem speziellen Modul und es ist super frustrierend. Dieses Problem sieht sehr einfach aus. Vielleicht bin ich darüber nachgedacht. Hoffentlich wird jemand sagen, dass ich es bin. :)Sails.js Modellmethode (non-instance)

In diesem Modul habe ich beschlossen, Methoden aus meinem Modell zu verwenden. Dieser besondere ist nicht instanziert. Hier ist mein Modell:

/* 
* 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'; 
    }, 
}; 

ich es von einem meiner Controller wie folgt aufrufen:

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

An diesem Punkt account ‚s-Wert ist‚brach‘. Ich verstehe nicht, warum es nicht entweder "err" oder "ok" zurückgeben würde. Ich habe meine eigentliche Funktion hier zum Testen vereinfacht.

bearbeiten:

Ich habe andere Anrufe, die richtig funktionieren. Zum Beispiel:

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); 
    }); 
    }, 

Ist wie folgt aufgerufen:

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

Die Definition einen Rückruf hat, aber ich eigentlich eine nicht verwenden, da es nicht benötigt wird. Die Methode funktioniert gut.

Sails.js documentation bietet Beispielmethoden, die keine Rückrufe verwenden. Sie geben einfach die angeforderten Daten zurück.

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

} 

Und wie folgt aufgerufen:

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

Was ist das, was ich mit meiner Methode zu tun an der Spitze von diesem Post versuchen. Es scheint wie die exec() Teil Account.findOne() wird nicht einmal aufgerufen.

Antwort

1

Sails.js & Node.js sind asynchron. In einfachen Worten warten sie also nicht auf eine Antwort von der Datenbank, aber wenn sie ein Datum haben, rufen sie einen Rückruf auf. Also müssen Sie über Queries and callbacks lesen und was ist callback hell (Sie sollten das nie tun).

Und jetzt zurück zu Ihrem Problem.

/* 
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); 
} 

//... 

Tipp: Rückrufe erster Parameter ist immer Fehler.

// 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

danke für Ihre Antwort. Bitte lesen Sie meinen ursprünglichen Beitrag. Ich habe einige Änderungen vorgenommen. – sirEgghead

+0

Methoden können die Rückgabe verwenden, wenn sie nicht asynchron sind. Alle DB-Methoden sind so, dass Sie Callback wie in updateBalance verwenden müssen. Es ist der Kernunterschied zwischen Knoten und anderen Programmiersprachen. Fügen Sie etwas Debug in Ihrem Code wie sails.log (err, a) hinzu und Sie werden sehen, ob es ausgeführt wird. Methode schreiben wie folgt immer 'pleite' – Bonanza

+0

Interessant. Vielen Dank für Ihre zusätzliche Hilfe. Ich lese jetzt gründlich über Ihren Rückruf-Link. :) – sirEgghead