我正在尝试使用MongoDB Mongoose和Express.JS 4 Bluebird保存数据。
我所做的就是这样 -
var mongoose = require('mongoose');
mongoose.Promise = require('bluebird');
.......
.......
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function()
{// successfully connected!
console.log("Successfully Connected to Mongo-DB");
});
在控制台中获取此信息 -
Successfully Connected to Mongo-DB` - So, MongoDB connected successfully
var mongoose = require('mongoose');
var postSchema = new mongoose.Schema({
created_by: String, //should be changed to ObjectId, ref "User"
created_at: {type: Date, default: Date.now},
text: String
});
module.exports = mongoose.model('Post', postSchema);
var Post_Data = require("./models/post");
....
....
router.get('/', function(req, res, next)
{
var Post = mongoose.model("Post");
var post = new Post({
created_by: ""+Math.random()
});
console.log( Post.create(post) );
res.render(
'index',
{
title : 'Express',
site_name : 'Our Site',
layout : 'templates/layout'
}
);
});
之后我在控制台得到这个 -
Promise {
_bitField: 0,
_fulfillmentHandler0: undefined,
_rejectionHandler0: undefined,
_promise0: undefined,
_receiver0: undefined }
但是,没有保存,证据就是 -
我发现了这个 -
使用MongoBooster后。
更新 -
我的数据库配置是这样的 -
"MONGO_URI": "mongodb://localhost:27017/express_test",
"MONGO_OPTIONS": {
"db": { "safe": true },
"name":"express_test"
}
那么,有人可以帮忙,为什么不保存任何东西?
提前感谢您的帮助。
答案 0 :(得分:2)
.create()
功能是exec bash
和.save()
的快捷方式。您正在尝试new Model
.create
的实例,而不是简单的对象。请参阅Constructing documents in Mongoose's Models documentation了解他们的简单示例。
Mongoose数据函数的返回只是将来运行异步任务的承诺,记录在很大程度上是毫无意义的。使用.then()
等待承诺解决。
您的代码中也缺少错误处理,可能会在那里抛出一些东西。使用.catch()
进行承诺错误处理。
Model
所有这一切都可以通过回调(如Mongoose docco示例)完成,但承诺,特别是蓝鸟承诺更好。
答案 1 :(得分:1)
我只是使用这种语法组合来创建和保存我的模型:
var myPage = new LandingPage({
user:req.user,
slug: req.body.slug,
}).save(function(err,savedModel){
if(!err){
console.log(savedModel);
}
});
答案 2 :(得分:1)
当您将模型导入为
时,您在app.js
模块中调用了错误的模型
var Post_Data = require("./models/post"); // <-- Post_Data model never used
....
....
但在路由器实现中创建一个新的Post
模型实例
var Post = mongoose.model("Post"); // <-- different model
var post = new Post({
created_by: ""+Math.random()
});
您需要致电并使用正确的型号。因此,我建议您重新编写app.js
模块,以使用 save()
方法:
var Post = require("./models/post"); // <-- import correct Post model
....
....
router.get('/', function(req, res, next) {
var post = new Post({ created_by: ""+Math.random() });
post.save().then(function(post) {
console.log(post); // <-- newly created post
res.render('index', {
title: 'Express',
site_name: 'Our Site',
layout: 'templates/layout'
});
})
.catch(function(err) {
console.error('Oopsy', err);
});
});
答案 3 :(得分:1)
如果您通过require将变量存储在变量中,则可以使用该变量。
var Post_Data = require("./models/post");
因此您可以使用new Post_Data
无需使用var Post = mongoose.model("Post");
,因为您已导出此架构module.exports = mongoose.model('Post', postSchema);
你可以尝试这个:
var Post_Data = require("./models/post");
router.get('/', function(req, res, next)
{
var post = new Post_Data({created_by: ""+Math.random()});
post.save(function(error, data) {
if(error) {
return res.status(500).send({error: 'Error occurred during create post'});
}
return res.render('index',{
title : 'Express',
site_name : 'Our Site',
layout : 'templates/layout'
});
});
});
答案 4 :(得分:0)
所以,如果你通过调用new Post(values)
在内存中创建一个文档,你将使用post.save(cb);
而不是'Post.create(post); , but I'm thinking that the underlying issue (though this isn't easy to be certain of based on the code you're showing) is that you're connecting with the MongoDB driver, rather than mongoose itself. Your
db保存它`变量未显示在您发布的代码中声明,因此我将其作为假设。
那就是说,如果我是对的,你需要调用mongoose.connect
或mongoose.createConnection
,以便Mongoose知道它连接到数据库并将文档保存到它。您可以将现有连接传递给mongoose,所以如果您已经这样做了,那么我为我的错误假设道歉。