2012-04-24 27 views
1

这是我的js文件,描述不起作用的模式和API。当我通过命令行工具执行此操作时...它的模式非常简单,我已经实现了一些简单的查找命令。无法使用猫鼬通过节点脚本保存mongodb记录

'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); 

和这里的简单节点脚本实例上面导出一个对象,并试图做模型上的save命令.....

'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(); 
+0

你看到了什么错误?当你说它不起作用时,是否有一些输出可以帮助我们诊断问题? – 2012-04-24 14:44:07

+0

什么都没有发生。我在命令行上使用节点运行程序:node sportsStandings.js,并且没有错误,并且没有任何提交到数据库,只要我可以使用mongo命令行工具进行分析。如果我使用mongo命令行来执行db.sportsStandings.insert(....),它可以工作.... – SPODOG 2012-04-24 18:23:41

回答

1

请记得编程时node.js,你必须非常小心事件驱动的编程风格。您的代码出现问题似乎是您在外部执行级别调用process.exit()。当你调用record.save(...)时,它会立即将控制权返回到外部执行级别,并且不允许执行保存或保存回调中的任何代码。

要解决这个问题,您需要将process.exit()移动到最内部回调函数的末尾,然后您应该看到预期的结果。

运行您的示例我发现了一些其他错别字和错误,您需要纠正。检查您的SportStanding(s)模型变量的拼写,并确保它匹配到处。另外,模型上的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(); 
    }); 
}); 
+0

非常感谢,修复它。 – SPODOG 2012-04-25 17:21:53