我是node.js和mongoose以及全栈Web开发的初学者。我一直在争取建立一个数据库并与我的服务器进行通信而无法让它工作。我一直在松散地学习本教程:Easily Develop Node.js and MongoDB Apps with Mongoose
无论如何,我的文件目前很简单。我的server.js与“models”文件夹位于同一目录中,该文件夹包含我的“testSchema.js”文件。
我有一个脚本可以通过按下server.js文件中的按钮来调用。
var mongoose = require('mongoose');
var mongoURL = "mongodb://username:password@localhost:27017/test";
mongoose.connect(mongoURL);
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
console.log("We have connected");
var Item = require("./models/testSchema");
var newItem = Item({
name: 'Peter',
score: 5
});
newItem.save(function(err) {
if (err) throw err;
console.log("Item Created");
});
});
mongoose.connection.close();
这应该将示例文档添加到我的模型中。 最后,testSchema.js:
var Schema = mongoose.Schema;
var ItemSchema = new mongoose.Schema({
name: {
type: String,
index: true
},
score : Number
});
var Item = mongoose.model('Item', ItemSchema);
module.exports = Item;
因此,当我运行脚本时,我收到消息“我们已连接!”,但不是消息“Item created”,也不是调用.save函数之后的任何错误日志。这似乎只是被跳过了,但我不知道mongoose和node.js在这种情况下的行为。 .save甚至被叫了吗?
此外:我的mongoDB数据库托管在Openshift上,但我已经将端口转发到localhost,看起来它工作正常。每当我调用脚本时,我都会收到消息“处理27017的连接”。
非常感谢任何帮助!
**编辑**
我无法发表评论,所以我只会编辑我的帖子。
Zachary Jacobi和Robert Klep的答案奏效了!非常感谢,我不知道节点是那样的异步。
答案 0 :(得分:2)
节点在I / O上是异步的,因此不一定按照它们在代码中出现的顺序发生。
这里数据库连接被打开,节点移动到下一个语句,而不等待回调中的其余内容完成。所以mongoose.connection.close();
实际上是在newItem.save(function(err) {...
之前执行的。
要解决此问题,请尝试:
var mongoose = require('mongoose');
var mongoURL = "mongodb://username:password@localhost:27017/test";
mongoose.connect(mongoURL);
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
console.log("We have connected");
var Item = require("./models/testSchema");
var newItem = Item({
name: 'Peter',
score: 5
});
newItem.save(function(err) {
if (err) throw err;
console.log("Item Created");
mongoose.connection.close();
});
});