Poniżej znajduje się literał obiektu, który próbuję zapisać do MongoDB. Jest zdefiniowany w pliku app.js, który jest serwerem Express. Ponieważ obiekt jest zakodowany na stałe w serwerze, moim założeniem było, że nowa kopia będzie zapisywana do bazy danych za każdym razem, gdy uruchomię serwer, lub przynajmniej dokument zostanie zapisany jeden raz, i zostanie przesłonięty lub pozostanie niezmieniony po wykryciu, że nowy dokument jest identyczny z zapisanym podczas ostatniego uruchomienia serwera. Ku mojemu zdziwieniu nie tylko kopie są tworzone w MongoDB, ale dokument nie jest w ogóle zapisywany. Została jednak utworzona kolekcja "news", która została zweryfikowana w Mongo Shell 'show collections'. Ponadto nie otrzymuję żadnego błędu w funkcji wywołania zwrotnego. Próbowałem również Model.create (doc, fn) na mojej trasie Express/news, ale to też nie działa (dokument powinien być zapisany za każdym razem, gdy trasa "/ news" jest wywoływana przez klienta, ale nie jest). czego mi brakuje?
Przeczytaj moje adnotacje oznaczone "< -", aby zobaczyć, jakie inne problemy lub nieoczekiwane zachowanie napotykam. Będę bardzo wdzięczny, jeśli mógłbyś odpowiedzieć na to również w swojej odpowiedzi.Mongoose nie zapisuje danych do 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'));
});
Dziękuję za poświęcony czas
poważaniem
Jared
Czy wywołanie 'mongoose.connect' aby połączyć się z bazą danych gdzieś poza tym kodem? – JohnnyHK
@JohnnyHK Tak, jestem. Zobacz zaktualizowane pytanie. Zawarłem odpowiedni kod. –