2013-08-15 37 views
6


Dưới đây là một đối tượng theo nghĩa đen tôi đang cố lưu vào MongoDB. Nó được định nghĩa trong tệp app.js là một máy chủ Express. Khi đối tượng được mã hóa cứng trong máy chủ, giả định của tôi là một bản sao mới sẽ được lưu vào DB mỗi khi tôi chạy máy chủ hoặc ít nhất tài liệu sẽ được lưu một lần và ghi đè hoặc để lại không thay đổi khi phát hiện tài liệu mới giống với tài liệu được lưu trên lần chạy máy chủ cuối cùng. Theo kinh ngạc của tôi, không chỉ không có bản sao nào được tạo ra trong MongoDB, nhưng tài liệu không được lưu lại chút nào. Tuy nhiên, bộ sưu tập 'tin tức' đã được tạo ra, như đã được xác minh với bộ sưu tập hiển thị mongo shell. Ngoài ra, tôi không nhận được bất kỳ lỗi nào trong hàm gọi lại. Tôi cũng đã thử Model.create (doc, fn) trong tuyến đường Express '/ news' của tôi, nhưng điều này cũng không hoạt động (tài liệu nên được lưu mỗi khi tuyến đường '/ news' được gọi bởi khách hàng, nhưng nó không phải). Tôi đang thiếu gì?
Vui lòng đọc chú thích của tôi được đánh dấu bằng "< -" để xem những vấn đề khác hoặc hành vi bất ngờ mà tôi gặp phải. Tôi sẽ rất biết ơn nếu bạn có thể giải quyết những người cũng như trong câu trả lời của bạn.Mongoose không lưu dữ liệu vào MongoDB

var express = require('express') 
    , routes = require('./routes') 
    , user = require('./routes/user') 
    , http = require('http') 
    , path = require('path') 
    , fs = require('fs'); 

// Defining connection to the database: 
var mongoose = require('mongoose'). 
    connect("mongodb://localhost:27017/my-test-db"), 
    db = mongoose.connection; 
var Schema = mongoose.Schema; 
var ObjectID = Schema.ObjectId; 
// Setting up the debug flag: 
mongoose.set('debug, true'); 
// Logging connection: 
db 
    .on('error', console.error.bind(console, 'DB connection error.')) 
    .once('open', console.log.bind(console, 'DB Connection established.')); 

// Defining MongoDB schemas: 
var usr = new Schema({ 
    first: String, 
    last: String 
}); 
var newsSchema = new Schema({ 
    headline: String, 
    bd: String, 
    imgURI: String, 
    imgThumbURI: String, 
    imgCaption: String, 
    addedOn: Date, 
    addedBy: { 
     type: ObjectID, 
     ref: 'usr' 
    } 
// On user action 'save' populate the addedOn and addedBy fields before the news article is actually saved to the DB: 
newsSchema.pre('save', function(next){ 
    if(!this.addedOn) this.addedOn = new Date(); 
    if(!this.addedBy) this.addedBy = {first: "admin", last: "admin"}; 
}); 
// Indexing important fields: 
usr.index({last: 1}); 
newsSchema.index({headline: 1}); 
//Adding the News model: 
var News = mongoose.model('news', newsSchema); 

var nws1 = new News({ 
    headline: "Test news Headline", 
    bd: "Test news body. Test news body. Test news body. Test news body. Test news body. ", 
    imgURI: encodeURI("images/news/img.jpg"), 
    imgThumbURI: encodeURI("images/news/thumbs/img.jpg"), 
    imgCaption: "Test news image caption.", 
    addedOn: new Date(), 
    addedBy: {first: "Admin", last: "Admin"} 
}); 
nws1.save(function(err, news){ 
     if(err) return console.error("Error while saving data to MongoDB: " + err); // <- this gets executed when there's an error 
     console.error(news); // <- this never gets logged, even if there's no error. 
    }); 

var app = express(); 

// all environments 
app.set('port', process.env.PORT || 3000); 
app.set('views', path.resolve(__dirname + '/public')); 
app.set('view engine', 'html') 
    .engine('html', function(path, options, fn){ 
     if('finction' == typeof options){ 
      fn = options, options = {}; 
     } 
     fs.readFile(path, 'utf8', fn); 
    }); 
app.use(express.favicon()); 
app.use(express.logger('dev')); 
app.use(express.bodyParser()); 
app.use(express.methodOverride()); 
app.use(express.session()); 

app.use(express.static(path.join(__dirname, 'public'))); 
http.createServer(app).listen(app.get('port'), function(){ 
console.log('Express server listening on port ' + app.get('port')); 
}); 

Cảm ơn bạn đã dành thời gian
Trân trọng
Jared

+1

Bạn đang gọi 'mongoose.connect' để kết nối với cơ sở dữ liệu ở đâu đó bên ngoài của mã này? – JohnnyHK

+0

@JohnnyHK Vâng, tôi. Vui lòng xem câu hỏi được cập nhật. Tôi đã bao gồm mã có liên quan. –

Trả lời

24

Dường như vấn đề là ở lưu middleware schema tin tức của bạn.

newsSchema.pre('save', function(next){ 
    if(!this.addedOn) this.addedOn = new Date(); 
    if(!this.addedBy) this.addedBy = {first: "admin", last: "admin"}; 
}); 

Chức năng của bạn nhận được cuộc gọi lại "tiếp theo" mà bạn phải thực hiện để cho mongoose biết rằng bạn đã hoàn tất và sẵn sàng lưu tài liệu. Vì bạn không gọi nó, nó có thể giải thích tại sao bạn không nhận được gì, và cũng không có lỗi.

Cố gắng chỉ gọi tiếp theo như thế này:

newsSchema.pre('save', function(next){ 
    if(!this.addedOn) this.addedOn = new Date(); 
    if(!this.addedBy) this.addedBy = {first: "admin", last: "admin"}; 
    next(); 
}); 
+0

Cảm ơn bạn rất nhiều supershabam. Đây là những gì tôi đã mất tích. Một điều nhỏ nhặt như vậy, nhưng lại bị tổn thương rất nhiều (rất nhiều thời gian lãng phí khi cố tự mình tìm ra nó). Rất nhiều tình yêu danh tiếng của tôi dành cho bạn giao phối. –

+0

Ah vì *** && !!! lợi ích! Tôi đã bị mắc kẹt trên cùng một lỗi trong 4 giờ !!! Cảm ơn bạn!!!! –

+0

Ôi trời ơi, tôi không thể cảm ơn đủ. Tôi đã sai lầm khi di chuyển một số mã và cuộc gọi "next()" của tôi chỉ là "tiếp theo", tất nhiên, không bao giờ thực hiện cuộc gọi lại. Tôi đã bị mắc kẹt trên này trong nhiều giờ là tốt. THANK YOU –

4

Tôi tìm thấy một vài vấn đề khi cố gắng tái sản xuất này tại địa phương.

Bạn sẽ không gọi tiếp theo() trong newsSchema.pre ('tiết kiệm')

Nên

newsSchema.pre('save', function(next){ 
    if(!this.addedOn) this.addedOn = new Date(); 
    if(!this.addedBy) this.addedBy = adminUser; 
    next(); 
}); 

Bạn cũng cần phải chắc chắn rằng bạn đang kết nối với db trước khi thực hiện bất kỳ của công cụ này, không chắc chắn nếu bạn đang có hay không kể từ khi tôi đã không nhìn thấy một phần của mã.

+3

Tuyệt vời. Đó là chính xác những gì tôi đã mất tích. 1 cho bạn, nhưng 'câu trả lời được chấp nhận' của tôi sẽ được gửi đến SuperShabam vì anh ấy đã đưa thêm chi tiết về vấn đề này. Ngoài ra anh ta cần nhiều điểm danh tiếng hơn :). Bất kỳ cách nào, cảm ơn rất nhiều. –

0

Mã của tôi khác, nhưng kết quả của tôi dường như giống nhau: Rõ ràng, tôi đã không tiết kiệm cho Mongo mặc dù cuộc gọi .save. TUYỆT VỜI, tiết kiệm đã được thực sự diễn ra, tôi chỉ không nhận ra những gì một số các thông số Mongoose có nghĩa là, và rằng phải mất một số quyền tự do tạo thành tên bộ sưu tập của bạn.

Cụ thể hơn, khi bạn sử dụng:

mongoose.model('MyModelName', invitationSchema); 

để tạo thành tên bộ sưu tập của bạn, tên mô hình của bạn được chuyển đổi để giảm trường hợp và một "s" được nối (nếu không có). Xem thêm http://samwize.com/2014/03/07/what-mongoose-never-explain-to-you-on-case-sentivity/

Bạn có thể, nếu bạn muốn, bỏ qua các quy ước đặt tên bộ sưu tập này ở một mức độ nào đó bằng cách sử dụng tham số tên bộ sưu tập khi bạn tạo giản đồ.Xem http://mongoosejs.com/docs/guide.html#collection

Dưới đây là tôi:

const modelName = "SharingInvitation"; 
const collectionName = modelName + "s"; 

const numberOfHoursBeforeExpiry = 24; 

var expiryDate = new Date(); 
expiryDate.setHours(expiryDate.getHours() + numberOfHoursBeforeExpiry); 

var invitationSchema = new Schema({ 
    // _id: (ObjectId), // Uniquely identifies the invitation (autocreated by Mongo) 

    // gives time/day that the invitation will expire 
    expiry: { type: Date, default: expiryDate }, 

    // The user is being invited to share the following: 
    owningUser: ObjectId, // The _id of a PSUserCredentials object. 
    capabilities: [String] // capability names 
}, { collection: collectionName }); 
Các vấn đề liên quan