2012-03-10 13 views
0

を持っていない私次のコードを持っている:私はために何ができるかSequelizeの検索は成功機能

C:\Users\lowerkey\Desktop\emasc\server\controllers\Employee.js:85 
           model.Person.find(employees[i].personID).success (function(person){ 
              ^TypeError: Object [object Object] has no method 'success' 
    at [object Object].<anonymous> (C:\Users\lowerkey\Desktop\emasc\server\contr ollers\Employee.js:85:46) 
    at [object Object].emit (events.js:67:17) 
    at [object Object].<anonymous> (C:\Users\lowerkey\Desktop\emasc\node_modules \sequelize\lib\query-interface.js:245:17) 
    at [object Object].emit (events.js:88:20) 
    at [object Object].<anonymous> (C:\Users\lowerkey\Desktop\emasc\node_modules \sequelize\lib\dialects\mysql\query.js:78:10) 
    at C:\Users\lowerkey\Desktop\emasc\node_modules\sequelize\lib\dialects\mysql \query.js:32:51 
    at Query.<anonymous> (C:\Users\lowerkey\Desktop\emasc\node_modules\sequelize \node_modules\mysql\lib\client.js:108:11) 
    at Query.emit (events.js:64:17) 
    at Query._handlePacket (C:\Users\lowerkey\Desktop\emasc\node_modules\sequeli ze\node_modules\mysql\lib\query.js:51:14) 
    at Client._handlePacket (C:\Users\lowerkey\Desktop\emasc\node_modules\sequel ize\node_modules\mysql\lib\client.js:312:14) 

app.get('/autocompleteEmployees', function(req, res){ 
    var term = req.param('term'); 
    model.Employee.findAll().success(function(employees){ 
     var responseData = []; 
     for(var i=0; i<employees.length; i++){ 
      console.log('i: ' + i); 
      model.Person.find(employees[i].personID).success(function(person){ 
       if((person.lastName + ', ' + person.firstName).toLower().indexOf(term.toLower()) > -1){ 
        responseData.push({ 
         label: person.lastName + ', ' + person.firstName, 
         value: employees[i].id 
        }); 
       } 

       if(i + 1 == employees.length){ 
        res.send(JSON.stringify(repsonseData)); 
       } 
      }); 
     } 
    }); 
}); 

をGET/autocompleteEmployeesルートが呼び出されると、私は次のエラーを取得しますエラーを取り除く?

+0

モデル定義を追加できますか?あなたのモデルをモデル変数にバインドする行も表示されますか? – sdepold

+0

正直言って、私は窓で続けることを試みたことがありませんでした:D – sdepold

+0

私はそれを理解しました:従業員[i] .personID変数がnullでした。私が非同期のものを扱っていることがわかります.forループのコードが呼び出されるまでに、私はすでにemployees.lengthよりも大きくなっています。解決策は、非同期性を考慮した別個のカウンタを持つことでした。ぼんやりとした説明に申し訳ありません...それは数日です。それを調べてくれてありがとう! – lowerkey

答えて

0

for-loopsと非同期コードを単に混ぜ合わせたものではないことがわかります。自分と同じ道を歩く人のため

ソリューションは、このような何かを行く:あなたはそれが簡単ではなく自分でものを定義するよりも、人気のasyncライブラリからのforEachの呼び出しを使用することを見つけるかもしれ

Array.prototype.foreach = function(callback) { 
    for(var k=0; k<this .length; k++) { 
    callback(k, this[ k ]); 
    } 
} 

app.get('/autocompletePersonEmployees', function(req, res){ 
    console.log('/autocompleteEmployees'); 

    var term = req.param('term', null); 
    if(term == null){ 
     model.Employee.findAll().success(function(employees){ 
      var responseData = []; 
      employees.foreach(function(i, employee){ 
       console.log(i + ' ' + employee.toString()); 
       model.Person.find(employee.personID).success(function(person){ 
        responseData.push({ 
         label: person.lastName + ', ' + person.firstName, 
         value: employee.id 
        }); 

        if(i+1 == employees.length){ 
         res.send(JSON.stringify(responseData)); 
        } 
       }); 
      }); 
     }); 
    } 
    });