Node.JS Express 4 - Mongoose Не сохраняет данные

Я пытаюсь сохранить данные в MongoDB с Mongoose с Express.JS 4 и ********.

Я сделал так:

бен /WWW

var mongoose = require('mongoose');
mongoose.Promise = require('********');
.......
.......
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 }

Но ничего не сохраняется, доказательство для этого -

Я нахожу это -

После использования MongoBooster.

Update -

Конфигурация моего DB такова:

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

Итак, может ли кто-нибудь помочь, почему он ничего не спасает?

Заранее благодарим за помощь.

5 ответов

Функция .create() является ярлыком для new Model и .save(). Вы пытаетесь .create создать экземпляр Model вместо простого объекта. См. Построение документов в документации Mongoose Models для их быстрого примера.

Возврат из функции данных Mongoose - это просто обещание асинхронной задачи, которая должна быть запущена в будущем, запись, которая в значительной степени бессмысленна. Используйте .then(), чтобы подождать, пока обещание не будет устранено.

В вашем коде отсутствует обработка ошибок, что-то может быть брошено туда. Используйте .catch() для обработки ошибок обещаний.

Post.create({ created_by: ""+Math.random() })
.then(function (result) {
 console.log('Saved' result)
})
.catch(function (err) {
 console.error('Oh No', err)
})

Все это можно сделать с помощью обратных вызовов (например, примеров Mongoose docco), но promises, особенно ******** promises, лучше.


Вы вызываете неправильную модель в своем модуле 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);
 });
});


если вы сохраняете схему сообщений в переменной по требованию, тогда можете использовать эту переменную.

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


Я просто использую эту синтаксическую комбинацию для создания и сохранения моей модели:

var myPage = new LandingPage({
 user:req.user,
 slug: req.body.slug,
}).save(function(err,savedModel){
 if(!err){
 console.log(savedModel);
 }
});


Итак, это правда, что если вы создаете документ в памяти, вызывая 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 знал, что он подключен к db и сохраняет документы на нем. Вы можете передать существующее соединение с mongoose, поэтому, если вы уже это делаете, я приношу свои извинения за ошибочное предположение.

licensed under cc by-sa 3.0 with attribution.