2016-05-03 3 views
0

Я работаю над этим приложением некоторое время. У меня есть еще несколько модулей, которые работают нормально. У меня была тонкая проблема с этим конкретным модулем, и это супер разочаровывает. Эта проблема выглядит очень просто. Может быть, я об этом подумал. Надеюсь, кто-то скажет, что я есть. :)Метод модели Sails.js (не экземпляр)

В этом модуле я решил использовать методы из своей модели. Этот конкретный не является инстантом. Вот моя модель:

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

Я называю это один из моих контроллеров, как это:

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

На данный момент AccountName значение «s является„сломал“. Я не понимаю, почему это не вернет «err» или «ok». Я упростил свою фактическую функцию здесь для тестирования.

Edit:

У меня есть другие вызовы, которые работают должным образом. Например:

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

Называется так:

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

определение имеет обратный вызов, но я на самом деле не использовать, потому что она не нужна. Метод работает отлично.

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

Методы могут использовать возврат, если они не являются асинхронными. Все методы БД - это то, что вам нужно использовать обратный вызов, как в updateBalance. Это основное отличие между узлами и другими языками программирования. Добавьте отладку в свой код, например sails.log (err, a), и вы увидите, выполняется ли он. Метод пишет, как это всегда будет возвращать «сломан» – Bonanza

+0

Интересно. Благодарим вас за дополнительную помощь. Теперь я полностью перечитываю ссылку на аддоны обратного вызова. :) – sirEgghead