Ist es sicher, ein Versprechen nicht zu lösen oder abzulehnen?

Stellen Sie sich eine Webanwendung mit Routen vor, die prüfen müssen, ob der Benutzer auf eine bestimmte Ressource zugreifen darf, bevor Sie fortfahren. Die Prüfung "ist authentifiziert" beruht auf einem Datenbankaufruf.

In jeder Route kann ich haben:

authorizeOwnership(req, res)
.then(function() {
    // do stuff
    res.send(200, "Yay");
});

Ich will dasauthorizeOwnership() Funktion zum Verarbeiten von 403 (Zugriff verweigert) und 500 (z. B. Datenbankabfragefehler) Antworten, sodass nicht jede Route dies explizit tun muss.

Ich habe eine Funktion, die die Datenbank abfragen kann, um den Besitz zu überprüfen.

function confirmOwnership(resourceId, userId) {
    // SequelizeJS... returns a bluebird promise
    return Resource.find({
        where: {id: resourceId, userId: userId}
    })
    .then(function(resource) {
        if(!resource) {
            return null; // no match for this resource id + user id
        } else {
            return resource;
        }
    });
}

Dies wird dann in verwendetauthorizeOwnership:

function authorizeOwnership(req, res) {
    var rid      = parseInt(req.params.rid, 10),
        userId   = parseInt(req.authInfo.userid, 10);

    return new Promise(function(resolve, reject) {
        confirmOwnership(rid, userId)
        .then(function(resource) {
            if(resource === null) {
                res.send(403, "Forbidden");
                // Note: we don't resolve; outer handler will not be called
            } else {
                resolve(resource);
            }
        })
        .catch(function(err) {
            console.log(err);
            res.send(500, "Server error");
            // Note: we don't resolve; outer handler will not be called
        });
    });
}

In diesem Szenario rufe ich bewusst nicht anreject() oderresolve() in einigen der Codepfade. Wenn ja, dann meine "äußere" Routenlogik (der Code, der aufruftauthorizeOwnership()) wird komplizierter, weil es Fehler behandeln muss (entweder mit einem.catch() oder mit anull Check-In.then()).

Zwei Dinge machen mich allerdings etwas nervös:

Ist es OK für das Versprechen, das von zurückgegeben wurde?authorizeOwnership() nie in Fehlerszenarien gelöst werden? Wird es eine Verzögerung oder einen Speicherverlust verursachen?

Ist es logisch zu lösenconfirmOwnership() mit null zu sagen "keine passende Ressource gefunden" und behandeln Sie das dann als Fehler inauthorizeOwnership()? Mein erster Versuch lehnte das Versprechen abconfirmOwnership() Wenn es keine passende Ressource gab, wurde dies jedoch komplizierter, da es schwierig ist, zwischen dieser Ressource (Fall 403) und einem tatsächlichen Fehler (Fall 500) zu unterscheiden.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage