• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[FRAGE] nodejs Mongoskin ergebnis ausgeben

m1xm

New member
Hallo,

ich nutze folgenden Code, um eine Mongodb Abfrage mit Mongoskin durchzuführen:

Code:
db.collection('data').findOne({name:name}, function(err, res) {
        console.log(res._id);
    });

Das funktioniert.

Aber ich bin nun schon wirklich am verzweifeln, weil ich das ergebnis nicht aus diesem Block herausbekomme!

etwas wie

Code:
var id = null;

db.collection('data').findOne({name:name}, function(err, res) {
        id = res._id;
    });

console.log(id);

funktioniert nicht.


vielen Dank für hilfreiche Antworten,

m1xm
 
natürlich funktioniert das nicht, ist ja schließlich ein asynchroner Zugriff. die Ergebnisverarbeitung muß im Callback stattfinden.
 
Hallo,

danke für die Antwort.

Gibt es denn überhaupt eine Möglichkeit, diese Abfrage umzuschreiben, um die Asynchronität zu umgehen?

Gruß
m1xm
 
Ok, danke.

Ich bin in der Materie ziemlich neu und verstehe nicht wirklich, wie ich das auf meinen Code anwenden muss.

Könnte mir das bitte jemand zeigen, wenn es nicht zu viel Aufwand ist?
 
unterstützt mongoskin überhaupt Promises?

Da du neu in der Materie bist, riete ich dir davon ab, das jetzt zu versuchen. Promises sind ein sehr fortgeschrittenes Konzept, das ohne gutes Verständnis von Closures und Scope zu kompliziert ist (und wirklich synchron wird der Code dadurch auch nicht).

nur mal als Beispiel, eine Funktion die im System (MongoDB via mongoose) ein "friend request" hinterlegt: (die Promise erkennt man am .then())
PHP:
	// write a friendship request message (AJAX)
	app.get('/friendship', function(req, res, next) {
		// check User ID
		if (!("id" in req.query)) {
			res.status(400).end();
			return null;
		}
		User
			.findById(req.query.id)
			.exec()
			.then(function(user) {
				// check if recipient exists
				if (!user) {
					throw new Error("Nutzer unbekannt.");
				}
				// check if you’re already a friend
				if (user.friends.indexOf(req.user._id) > -1) {
					throw new Error("Freundschaft existiert bereits.")
				}
				// check if there is a pending friendship request
				return Message
					.find({
						sender:    req.user._id,
						recipient: req.query.id,
						topic:     "friendship request",
						read:      false,
						deleted:   false
					})
					.count()
					.exec()
				;
			})
			.then(function(count) {
				if (count > 0) {
					throw new Error("Freundschaftsanfrage läuft bereits.")
				}
				// check if the last rejected friendship request 
				// is younger than 1 month (FR spam protect)
				var datetime = new Date();
				datetime.setMonth(datetime.getMonth() - 1);
				return Message
					.find({
						sender:    req.user._id,
						recipient: req.query.id,
						topic:     "friendship request"
					})
					.where("created")
					.gt(datetime)
					.count()
					.exec()
				;
			})
			.then(function(count) {
				if (count > 0) {
					throw new Error("Die letzte Freundschaftsanfrage ist jünger als 1 Monat.")
				}
				// finally create the message
				return Message.create({
					sender:    req.user._id,
					recipient: req.query.id,
					topic:     "friendship request"
				});
			})
			.then(function(msg) {
				res.status(204).end();
			})
			.then(null, function(err) {
				res.status(500).end(err.message);
			})
		;
	});
 
Vielleicht sollte ich etwas mehr von dem Problem erläutern:

Hintergrund ist, dass ich auf einen POST-Request (express.js) die Object-id des angefragten Namens zurückgeben will:

Code:
app.post('/', function(req, res) {
var name = req.body.name;

var id = null;

db.collection('data').findOne({name:name}, function(err, res) {
        id = res._id;
    });

res.send(id);
});

Vielleicht hilft das weiter
 
Du kannst doch die Antwort auch einfach im asynchronen Callback machen...
Code:
app.post('/', function(req, res) {
var name = req.body.name;

var id = null;

db.collection('data').findOne({name:name}, function(err, res) {
        var id = res._id;
        res.send(id);
    });
});
 
Toll, darauf bin ich gar nicht gekommen!

Ich habe meinen Code nun etwas modifiziert, da eigentlich ein paar Ergebnisse nach diesem Schema abgerufen werden sollten und diese dann als gesamtes Paket zurückgegeben. Jetzt führe ich diese Abfragen jeweils im Callback der vorhergehenden Abfrage aus und sende dann die Ergebnisse.

Das ist vielleicht nicht die schönste Art, aber fürs erste tut es das.
 
Sind die Abfragen voneinander abhängig? Wenn nicht, könntest du die auch parallel ausführen und damit die Antwortzeit reduzieren.
 
Dann musst du sie so hintereinander ausführen - wollte das nur einfach noch klären. Wäre ja schön gewesen, wenn man' noch etwas beschleunigen hätte können.
 
Zurück
Oben