1

これが、機能しないスキーマとAPIを記述した私のjsファイルです。コマンドラインツールを使用してこれを行うと、スキーマは非常に単純で、いくつかの簡単な検索コマンドを実装しました。

'use strict'

var util    = require('util');
var bcrypt  = require('bcrypt');
var mongoose = require('mongoose');
var Schema   = mongoose.Schema;

var validatePresenceOf = function(value){
  return value && value.length; 
};

var toLower = function(string){
  return string.toLowerCase();
};

var SportsStandings = new Schema({
  'sport' : { type : String, 
              validate : [validatePresenceOf, 'a sport is required'],
              set : toLower
            },
  'league' : { type : String, 
              validate : [validatePresenceOf, 'a league is required'],
              set : toLower
            },
  'division' : { type : String, 
              validate : [validatePresenceOf, 'a division is required'],
              set : toLower
            },
  'teamName' : { type : String, 
              validate : [validatePresenceOf, 'a teamName is required'],
              set : toLower
            },
   'wins' : { type : Number, min: 0, 
              validate : [validatePresenceOf, 'wins is required'],
            },
   'losses' : { type : Number, min: 0, 
              validate : [validatePresenceOf, 'losses is required'],
            }
});

SportsStandings.statics.findTeamRecord = function(sport, league, 
                                                  division, teamName,
                                              cb) {
  return  this.find({'sport' : sport, 'league' : league, 
                     'division' : division, 'teamName': teamName}, cb);
};

SportsStandings.statics.findBySport = function(sport, cb) {
  return  this.find({'sport' : sport}, cb);
};

module.exports = mongoose.model('SportsStanding' , SportsStandings);

上記でエクスポートされたオブジェクトをインスタンス化し、モデルで保存コマンドを実行しようとする単純なノードスクリプトを次に示します。

'use strict'

var util = require('util');
var mongoose = require('mongoose');
var db = mongoose.connect('mongodb://localhost/mydb');
var SportsStanding  = require('../schemas/SportsStandings');

var record = new SportsStanding({ 
          'sport' : 'mlb',
          'league' : 'AL',
          'divison' : 'east',
          'teamName' : 'New York Yankees',
          'wins' : 10,
          'losses' : 1});

record.save(function(err) {
    console.log('error: ' + err);
    SportsStandings.find().all(function(arr) {
    console.log(arr); 
    console.log('length='+arr.length);
    });
});

process.exit();
4

1 に答える 1

1

node.jsを使用してプログラミングする場合は、イベント駆動型プログラミングスタイルに十分注意する必要があることに注意してください。process.exit()コードの問題は、外部実行レベルで呼び出していることのようです。呼び出すrecord.save(...)と、すぐにその外部実行レベルに制御が戻り、保存の実行や保存のコールバック内のコードの実行が許可されなくなります。

これを解決するprocess.exit()には、最も内側のコールバック関数の最後に移動すると、期待する結果が表示されます。

あなたの例を実行すると、私はあなたが修正する必要がある他のいくつかのタイプミスと間違いを見つけました。SportStanding(s)モデル変数のスペルをチェックして、どこでも一致することを確認してください。また、モデルのonにはコールバックが必要であり、データベース内のすべてのレコードが返されるため(2番目のパラメーターとして-エラーフラグが最初です)、連鎖呼び出しfind()は必要ありません。all()保存機能に必要なものは、次のようになります。

record.save(function(err) {
  console.log('error: ' + err);
  SportsStandings.find(function(err, arr) {
      console.log(arr);
      console.log('length='+arr.length);
      process.exit();
  });
});
于 2012-04-25T06:59:24.813 に答える