在NodeJS中的需求sorting似乎会产生错误

我有一个订单的问题,我需要在我的主要server.js文件在NodeJS中的各种模型。 这是我的product.js产品型号文件:

var mongoose = require("mongoose"); var Dealer = require("./dealer.js") var productSchema = new mongoose.Schema({ title: String, price: String, dealers: [ { type: mongoose.Schema.Types.ObjectId, ref: "Dealer" } ] }); var Product = mongoose.model("Product", productSchema); Dealer.findOne({ name: "Glaze" }, function(err, dealer){ Product.findOne({title: "Awesome Metal Towels"}, function(err, product){ if(err){ console.log(err); } else{ product.dealers.push(dealer); product.save(function(err, data){ if(err){ console.log(err); } else{ console.log(data); } }) } }); }); module.exports = mongoose.model("Product", productSchema); 

这是我的Dealer.js文件,它定义了经销商模型:

 var mongoose = require("mongoose"); var Product = require("./product.js") var dealerSchema = new mongoose.Schema({ name: String, owner: String, estd: Number, description: String, legal: String, facilities: String, awards: String, hours: String, turnover: String, mode: String, employees: String, contact: String, address: String, email: String, notes: String, website: String, products: [ { type: mongoose.Schema.Types.ObjectId, ref: "Product" } ] }); var Dealer = mongoose.model("Dealer", dealerSchema); Product.find(function(err, data){ console.log(data); }); Product.findOne({ title: "Awesome Metal Towels" }, function(err, product){ Dealer.findOne({name: "Glaze"}, function(err, dealer){ if(err){ console.log(err); } else{ dealer.products.push(product); dealer.save(function(err, data){ if(err){ console.log(err); } else{ console.log(data); } }) } }); }); module.exports = mongoose.model("Dealer", dealerSchema); 

这里是主server.js文件:

 var express = require("express"); var app = express(); var bodyParser = require("body-parser"); // var seedDB = require("./seeds.js") var mongoose = require("mongoose"); // Connecting the models //////////////////// var Dealer = require("./models/dealer.js"); var Product = require("./models/product.js"); var Category = require("./models/category.js"); var Brand = require("./models/brand.js"); ///////////////////////////////////////////// app.use(express.static(__dirname + '/public')); //Connecting to the database var uri = process.env.MONGOLAB_URI || '127.0.0.1/flapi'; mongoose.connect(uri); ////////////////////////////////////////////// // //Seeding the database // seedDB(); ////////////////////// //Body Parser app.use(bodyParser.urlencoded({extended:true})); app.use(bodyParser.json()); //////////////////////////////////////////////////// var port = process.env.PORT || 3000; // CRUD Routes for Products /////////////////////////////////////////////////////// .................. 

运行代码时出现的错误是:

 /home/aayush/fl/models/product.js:16 Dealer.findOne({ ^ TypeError: Dealer.findOne is not a function at Object.<anonymous> (/home/aayush/fl/models/product.js:16:8) at Module._compile (module.js:435:26) at Object.Module._extensions..js (module.js:442:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:311:12) at Module.require (module.js:366:17) at require (module.js:385:17) at Object.<anonymous> (/home/aayush/fl/models/dealer.js:29:15) at Module._compile (module.js:435:26) at Object.Module._extensions..js (module.js:442:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:311:12) at Module.require (module.js:366:17) at require (module.js:385:17) at Object.<anonymous> (/home/aayush/fl/server.js:8:19) 

我无法弄清楚我做错了什么。 当我颠倒serve.js文件中的var Dealer和var Product的顺序时,出现另一个错误,说没有定义Product.findOne。

请帮忙!

在使用它们来消除循环之前,定义两个模式。 模式不需要彼此要求。 您可以从模型中移除find / findOne调用,并在实例化后调用它们。

看起来您可能会将产品模式与经销商的findOne结合起来,试图将经销商数据推送到产品模式。 架构不应该根据另一个架构的文档更改。

http://mongoosejs.com/docs/populate.html有一个很好的例子,说明如何使用两个模式引用其他集合中的文档&#x3002; 这表明它不需要模式需要彼此。

更新

我已经结合了一个快速工作的例子。 如果mongod在本地运行,这将运行。

server.js

 var express = require("express"); var app = express(); var bodyParser = require("body-parser"); var mongoose = require("mongoose"); var ObjectID = require('mongodb').ObjectID; var Dealer = require("./models/dealer.js"); var Product = require("./models/product.js"); app.use(express.static(__dirname + '/public')); mongoose.connect('mongodb://localhost:27017/test'); var db = mongoose.connection; db.on('error', console.error.bind(console, 'connection error:')); db.once('open', function() { var glaze = new Dealer({ _id: new ObjectID(), name: 'Glaze', owner: 'owner', estd: 2010, description: 'description', legal: 'legal', facilities: 'facilities', awards: 'awards', hours: 'hours', turnover: 'turnover', mode: 'mode', employees: 'employees', contact: 'contact', address: 'address', email: 'email@email.com', notes: 'notes', website: 'website.com', }); glaze.save(function (err) { if (err) { console.error('err: ' + err); } var product1 = new Product({ title: 'Awesome Metal Towels', price: '$17.99', dealers: [] }); product1.dealers.push(glaze._id); product1.save(function (err) { if (err) { console.error('err: ' + err); } }); Product.find(function(err, data){ console.log('[FIRST]: ' + data); }); Product.findOne({ title: "Awesome Metal Towels" }, function(err, product){ Dealer.findOne({name: "Glaze"}, function(err, dealer){ if(err){ console.log(err); } else{ dealer.products.push(product); dealer.save(function(err, data){ if(err){ console.log(err); } else{ console.log('[SECOND]: ' + data); } }); } }); }); }); }); 

product.js

 var mongoose = require("mongoose"); var productSchema = new mongoose.Schema({ title: String, price: String, dealers: [ { type: mongoose.Schema.Types.ObjectId, ref: "Dealer" } ] }); module.exports = mongoose.model("Product", productSchema); 

dealer.js

 var mongoose = require("mongoose"); var dealerSchema = new mongoose.Schema({ name: String, owner: String, estd: Number, description: String, legal: String, facilities: String, awards: String, hours: String, turnover: String, mode: String, employees: String, contact: String, address: String, email: String, notes: String, website: String, products: [ { type: mongoose.Schema.Types.ObjectId, ref: "Product" } ] }); module.exports = mongoose.model("Dealer", dealerSchema); 

运行上面的和节点打印的控制台:

 [FIRST]: { dealers: [ 5684f0b71e8265a43e3c9c27 ], __v: 0, price: '$17.99', title: 'Awesome Metal Towels', _id: 5684f0b71e8265a43e3c9c28 } [SECOND]: { products: [ 5684f0b71e8265a43e3c9c28 ], __v: 1, website: 'website.com', notes: 'notes', email: 'email@email.com', address: 'address', contact: 'contact', employees: 'employees', mode: 'mode', turnover: 'turnover', hours: 'hours', awards: 'awards', facilities: 'facilities', legal: 'legal', description: 'description', estd: 2010, owner: 'owner', name: 'Glaze', _id: 5684f0b71e8265a43e3c9c27 } 

希望这将有助于朝正确的方向前进。 为了保持简单,我在这里嵌套了一切。 承诺,发电机或单独的函数调用可能会更好。

尝试:

 var Dealer = require("./dealer") // ... var Product = require("./product") 

代替:

 var Dealer = require("./dealer.js") // ... var Product = require("./product.js")