2017-09-01 8 views
0

私のSails.jsアプリケーションでは、私のデータベースから承認されたユーザーの数を返し、count()クエリを使用してビュー内でcount変数を使用しようとしています。問題はそのコンソールでSails.jsモデル関数はビューで未定義を返します

<%= Users.countapproved() %> 

countapproved: function(req, res) { 
    Users.count({ approval_state: 'approved' }).exec(function(err, found) { 
     if (err) { 
      console.log('error.'); 
     } 
     console.log(found); 
     return found; 
    }); 
} 

そして、私はこのEJSスニペットで私の見解で値を取得しようとしています:私は私のUsers.jsモデルファイルにコードの下に書かれています。ログ(見つけた);正しい値を返しますが、ビューでは私は '未定義'と見ています。

編集:ユーザーモデルはグローバルにアクセス可能です。

edit2:これは私の見解では/users/countapproved.ejsにres.view({count:count})を付けても問題ありません。私はhomepage.ejsからこれにアクセスしようとしています。

ご協力ありがとうございます。

+0

コントローラの名前は何ですか? –

+0

モデル:Users.js コントローラー:UsersController.js –

+0

'sails.controllers.Users.countapproved()に' Users.countapproved() 'を変更します。 –

答えて

0

ejsテンプレートは、そのままの状態で関数を渡すことができません。そのためのグーグルリングは、そうするための多くのトリッキーな方法を確実にしてくれます。

しかし、それについて心配する前に、私はあなたのcountapprovedメソッドが非同期性の問題があるので、あなたが望んでいるとは思っていません。 Users.count().exec()を呼び出すと、それは非同期で実行されます。 execのコールバックが実行される前に、コードが下に続き、関数の終了を検出するとnullが返されます。コールバック内のコードが実行されると、関数はすでに返されています(ただし、console.logはうまく動作します)。

私があなただったら、私のテンプレートが非同期の関数を実行するようにしようとしています。そして私は、コールバックパラメータを使用してUsers方法を更新します:

countapproved: function(callback) { 
    Users.count({ approval_state: 'approved' }).exec(function(err, found) { 
     if (err) { 
      console.log('error:' + err); 
     } 
     console.log(found); 
     callback(err, found); 
    }); 
} 

あなたのビューで承認カウントをしたいときに、あなたは、コントローラのメソッドを介してルーティングする必要があります。

'GET /someroute': 'SomeController.someMethod' 

そして/api/controllers/SomeController中:/config/routes.js

module.exports = { 

    someMethod: function(req, res) { 
     Users.countapproved(function(err, found) { 
      if (err) { 
       // handle the error 
      } 
      return res.view('someView',{found: found}); 
     }); 
    } 

}; 
+0

答えに感謝しますが、私は2番目のコードブロックをどこに置くべきかを知ることができませんでした。それはビューにあるべきですか? res.viewはビューittself内にあれば、ターゲットビューをどのように理解できますか? –

+0

2番目のコードブロックは、ビューを返すために使用されるコントローラメソッドに入ります。ビューに直接ルーティングしていて、コントローラメソッドを使用していない可能性がありますので、これは見ていません。私はそれらの詳細を答えに入れます。 – arbuthnott

+0

私はここでそのコンセプトを理解できないと思う。私はコントローラメソッドを作成しませんでした。これは/ users/controllernameという名前のルートの中でこれにアクセスしたくないので、homepage.ejs( '/')の中でこれにアクセスしたいと思います。しかし、この方法にGET '/'経路をバインドすることは意味がありますか? –

関連する問題