Node.js-Express 3-MongoDBを使用した典型的なプロジェクトがあります
/routes/index.jsでモデル「Tweet」にクエリを作成しようとしていますが、アプリを実行するとクラッシュします
24 Aug 11:35:07 - [nodemon] starting `node app.js`
/Applications/XAMPP/xamppfiles/htdocs/ocesa/fanocesa/node_modules/mongoose/lib/index.js:286
throw new mongoose.Error.MissingSchemaError(name);
^
MissingSchemaError: Schema hasn't been registered for model "Teewt".
Use mongoose.model(name, schema)
at Mongoose.model (/Applications/XAMPP/xamppfiles/htdocs/ocesa/fanocesa/node_modules/mongoose/lib/index.js:286:13)
at Object.<anonymous> (/Applications/XAMPP/xamppfiles/htdocs/ocesa/fanocesa/routes/index.js:6:33)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at Object.<anonymous> (/Applications/XAMPP/xamppfiles/htdocs/ocesa/fanocesa/app.js:7:14)
at Module._compile (module.js:456:26)
24 Aug 11:35:07 - [nodemon] app crashed - waiting for file changes before starting...
これは私のapp.jsの一部です
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/fanOcesa');
var Schema = mongoose.Schema;
var ObjectID = Schema.ObjectID;
var Teewt = new Schema({
cuerpo: String
});
var Teewt = mongoose.model('Teewt', Teewt);
var app = express();
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
// development only
if ('development' == app.get('env')) {
app.use(express.errorHandler());
}
app.get('/', routes.index);
app.get('/users', user.list);
そして、これは私のindex.jsの一部です
var Teewt = require('mongoose').model('Teewt');
Teewt.find({}, function(err, docs){
console.log('docs');
console.log(docs);
});
exports.index = function(req, res){
res.render('index', {
docs: docs
});
};
このクエリを実行する正しい方法はどれですか?
_index.js
_ファイルは、_app.js
_ファイルが呼び出す場所で実行されます。
_var routes = require('./routes');
_
そのため、必ず_'Teewt'
_スキーマを_app.js
_のmongooseモデルとして登録するための呼び出しafterを呼び出してください。
私もこのエラーを受け取りました。長い間困惑し、このスレッドと同様のスレッドをたどって助けを求め、デバッグを試みました。最終的に、この問題は私の場合はマングースバージョンによるものであることが判明しました。 mongoose-fixtureを使用して、デフォルトのデータをシードしてmongoに入力しようとしていました。
これを試してください:プロジェクトのnode_modules
ディレクトリを削除し、npm cache clean
を実行してから、npm install
を実行します。それでも解決しない場合は、問題のあるアプリと動作するアプリの間でmongoose
/mongoose-fixture
のバージョンを比較し、package.json
のバージョンを変更して上記を繰り返してみてください。ステップ。これは私のために働いた。
スキーマとモデルに異なる名前を付けます。 Teewt
の再宣言はJavaScriptの「悪い部分」であり、プログラミング言語の間違いでもあります。スキーマTeewtSchema
とモデルTeewt
を呼び出すだけです(通常、スキーマはアプリケーションの1つのファイルでのみ使用されますが、モデルは広範囲に使用される可能性があるため)。
つまり、次の行(app.jsから):
var Teewt = mongoose.model('Teewt', Teewt);
ツイートが登録された後、その行で(index.jsで)呼び出す必要があります。
var Teewt = require('mongoose').model('Teewt');