节点的JS MongoDB不保存

我是新的节点JS,所以我可能会错过一些相当明显的东西。 我最近一直试图用mongoose把一些数据保存到数据库中,但是我一直没有成功。 尽pipe服务器告诉我它被保存,但是我的数据库中没有任何数据的跟踪。

app.js(靠近底部的代码的相关部分)

/* REQUIRES */ var express = require('express'); var mongoose = require('mongoose'); var bodyParser = require('body-parser'); var ejs = require('ejs'); var moment = require('moment'); var app = express(); var router = express.Router(); var port = 80; moment().format(); /* MONGOOSE CONNECT & MODEL */ mongoose.connect('mongodb://127.0.0.1:27017/giveaway'); var Giveaway = require('./models/giveaway'); var Entry = require('./models/entry'); /* EXPRESS APP LISTEN */ app.listen(port, function() { console.log('Magic happens on port %s.', port); }); /* VIEW ENGINE, MIDDLEWARE SETUP, AND STATIC FILES */ app.set('view engine', 'html'); app.engine('html', ejs.renderFile); app.use(express.static(__dirname + '/public')); app.use(bodyParser.urlencoded({ extended: false })); router.get('/:giveawayId', function(req, res, next) { var giveawayId = req.params.giveawayId; Giveaway.find({ _id: giveawayId }, function(err, giveaway) { if (err) throw err; if (Object.keys(giveaway).length < 1) { /* NO GIVEAWAY WITH THAT TITLE */ console.log("error"); next(); } else { res.render('pages/giveaway', { giveaway: giveaway }); } }); }); router.post('/:giveawayId/enter', function(req, res, next) { var giveawayId = req.params.giveawayId; var name = req.body.name; var email = req.body.email; if (name !== "" && email !== "") { Entry.findOne({ email: email }, function(err, entry) { if (err) throw err; if (entry !== null) { /* ALREADY ENTERED */ console.log("error"); console.dir(entry); next(); } else { console.log("success"); var newEntry = new Entry({ name: name, email: email, giveaway: giveawayId }); newEntry.save(function(err) { //PROBLEM IS HERE WHERE IT SAVES THE DATA if (err) throw err; res.redirect('/' + giveawayId); }); } }); } }); app.use('/', router); 

entry.js(相关模型)

 var mongoose = require('mongoose'); var Schema = mongoose.Schema; var entrySchema = new Schema({ name: String, email: String, giveaway: String, dateEntered: Date, winner: { type: Boolean, 'default': false } }); entrySchema.pre('save', function(next) { if (!this.dateEntered) { this.dateEntered = new Date; } next(); }); var Entry = mongoose.model('Entry', entrySchema); module.exports = Entry; 

app.js的底部附近的代码被保存到数据库的代码是问题的地方。 我假设这是某种asynchronous错误,我俯瞰,但所有的帮助将不胜感激。 另一个可能有用的信息是inputvariables的输出。 即使数据未显示在数据库中,也会显示为查询的结果。

 error model { '$__': InternalCache { strictMode: true, selected: undefined, shardval: undefined, saveError: undefined, validationError: undefined, adhocPaths: undefined, removing: undefined, inserting: undefined, version: undefined, getters: {}, _id: undefined, populate: undefined, populated: undefined, wasPopulated: false, scope: undefined, activePaths: StateMachine { paths: [Object], states: [Object], stateNames: [Object] }, ownerDocument: undefined, fullPath: undefined, emitter: EventEmitter { domain: null, _events: {}, _eventsCount: 0, _maxListeners: 0 } }, isNew: false, errors: undefined, _doc: { __v: 0, giveaway: 'NyX2sanGx', email: 'test', name: 'test', dateEntered: Wed Nov 11 2015 19:13:50 GMT-0800 (PST), _id: ObjectID { _bsontype: 'ObjectID', id: 'VD\u0003î½åwÑ89ì' } }, '$__original_save': { [Function] numAsyncPres: 1 }, save: [Function: wrappedPointCut], _pres: { '$__original_save': [ [Object], [Object], [Object] ] }, _posts: { '$__original_save': [] } } 

谢谢,卡梅隆琼斯

编辑:只是为了确认,其他时间我保存数据显示在数据库里面没有问题。 这只是最后一个行动了。

让Mongoose离开一会儿,让我们先尝试在Mongo上进行build模。

你的目标是允许每个赠品1个电子邮件条目,所以你首先创build独特的索引:

 db.entry.ensureIndex({email:1, giveaway:1}, {unique:true}); 

接下来,要做所有的事情,你会使用upsert (更新或插入)

编辑:删除$设置部分

 db.entry.update({ email: 'me@me.com', giveaway: 1 }, { $setOnInsert: { name: 'John', email: 'me@me.com', giveaway: 1, created: ISODate() } }, { upsert: true }); 

这意味着:尝试find用户与电子邮件me@me.com和赠品1 ,当找不到,然后创build名称,电子邮件,赠品,创build和修改date的新条目。

要查看您的logging:

 db.entry.findOne() { "_id" : ObjectId("56441446e480d6b501bd0a93"), "created" : ISODate("2015-11-12T04:23:34.086Z"), "email" : "me@me.com", "giveaway" : 1, "name": "John" } 

Mongoose支持$ setOnInsert

 var options = { upsert: true, 'new': true, setDefaultsOnInsert: true }; var find = { email: 'me@me.com', giveaway: 1, }; var setOnInsert = { email: 'me@me.com', giveaway: 1, name: 'John', created: new Date() }; Entry.findOneAndUpdate(find, {$setOnInsert: setOnInsert}, options);