Node.JS Express 4 - Mongoose不保存数据

时间:2016-08-09 05:45:17

标签: node.js mongodb express mongoose bluebird

我正在尝试使用MongoDB MongooseExpress.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

模型/ post.js

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);

app.js

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 }

但是,没有保存,证据就是 -

我发现了这个 -

enter image description here

使用MongoBooster后。

更新 -

我的数据库配置是这样的 -

"MONGO_URI": "mongodb://localhost:27017/express_test",
"MONGO_OPTIONS": {
                    "db": { "safe": true },
                    "name":"express_test"
                }

那么,有人可以帮忙,为什么不保存任何东西?

提前感谢您的帮助。

5 个答案:

答案 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.connectmongoose.createConnection,以便Mongoose知道它连接到数据库并将文档保存到它。您可以将现有连接传递给mongoose,所以如果您已经这样做了,那么我为我的错误假设道歉。