9

シンプルな Web アプリを構築するため、または Web アプリケーションについてもう少し独学するために、ノードと mongo を学習しようとしています。ただし、Model.save() を呼び出すと、継続関数が実行されないようで、データが保存されません。

これが私がこれまでに持っているものです:

/* app.js */

var express = require('express')
  , app = express()
  , routes = require('./routes')
  , http = require('http')
  , path = require('path')
  , mongoose = require('mongoose')
  , db 
  , Track
  , models = require('./models.js');

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'ejs');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser('secretstuff'));
  app.use(express.session());
  app.use(app.router);
  app.use(require('less-middleware')({ src: __dirname + '/public' }));
  app.use(express.static(path.join(__dirname, 'public')));
  app.use(function(err, req, res, next){
    console.error(err.stack);
    res.send(500, 'Something broke!');
  });
});

models.defineModels(mongoose, function(){
  app.Track = Track = mongoose.model('Track');
  db = mongoose.createConnection('localhost','nextrak')
});

app.get('/', routes.index);

app.get('/dbTest', function(req, res){
  console.log("Here goes...");
  var t = new Track({
    name: "TestTrack",
    artist: "Artist",
    tags: ["test"],
    next: ["track1","track2"]
  });
  console.log("Test Track:");
  console.log(t);

  t.save(function(){
    if(err)
      console.log("Error! Couldn't complete dbTest successfully.");
    else
      console.log("Aw yiss, got dbTest working");
  })
});

http.createServer(app).listen(app.get('port'), function(){
  console.log("Express server listening on port " + app.get('port'));
});


/*models.js*/

function defineModels(mongoose, cont){
  var Schema = mongoose.Schema;
  Track = new Schema({
    'name': { type: String, index: true },
    'artist': String,
    'tags': [String],
    'next': [String],
  });
  mongoose.model('Track', Track);
  cont();
}

exports.defineModels = defineModels;

エラーはスローされず、mongo ログは、アプリを起動したときに 5 つの新しい接続がスピンアップしたことを示しています。新しいログは表示されません ([clientcursormon] ログを除く)。Chrome で /dbTest をロードすると、アプリは次のように出力します。

ここに行きます...

  Test Track:
    { name: 'TestTrack',
      artist: 'Basik',
      _id: 5031606aa11cf95815000001,
      next: [ 'track1', 'track2' ],
      tags: [ 'test' ] }

Mongo は正しく構成されているようです。Mongoose が説明する単純な「Getting Started」スクリプトをノードで実行すると、すべてが正しく機能します。

誰かが私が間違っていることを指摘できますか?

4

2 に答える 2

16

Mongooseがデフォルトで使用する接続を作成していません。これを置き換えます:

db = mongoose.createConnection('localhost','nextrak')

これとともに:

db = mongoose.connect('localhost', 'nextrak');

他のいくつかのニット:

  1. Trackmodels.jsでグローバル変数として設定しています
  2. errコールバックにパラメータを追加する必要がありt.saveます。
于 2012-08-19T23:07:41.373 に答える
2

まず、接続が 1 つだけ必要な場合は、mongoose.connect() を使用する必要があります。

第二に、トラック スキーマとトラック モデルを混同していると思います。これらは 2 つの別個のものです。new Schema() は、mongoose.model() に渡される Schema オブジェクトを作成します。mongoose.model の結果 (破棄しているようです) は、スキーマではなく、データベースに格納する新しいインスタンスを作成するときに使用するものです。

于 2012-08-19T22:40:52.640 に答える