¿Es seguro no resolver o rechazar una promesa?

Imagine una aplicación web con rutas que necesitan verificar si el usuario puede acceder a un recurso determinado antes de continuar. La verificación "está autenticado" se basa en una llamada a la base de datos.

En cada ruta, puedo tener:

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

Quiero elauthorizeOwnership() función para manejar respuestas 403 (acceso denegado) y 500 (por ejemplo, error de consulta de base de datos) para que cada ruta no necesite hacerlo explícitamente.

Tengo una función que puede consultar la base de datos para verificar la propiedad.

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;
        }
    });
}

Esto luego se utiliza enauthorizeOwnership:

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
        });
    });
}

En este escenario, deliberadamente no llamoreject() oresolve() en algunas de las rutas de código. Si lo hago, entonces mi lógica de ruta "externa" (el código que llamaauthorizeOwnership()) se vuelve más complicado porque tiene que manejar errores (ya sea con un.catch() o con unnull registrarse.then())

Sin embargo, hay dos cosas que me ponen un poco nervioso:

¿Está bien para la promesa devuelta porauthorizeOwnership() para nunca ser resuelto en escenarios de error? ¿Causará un retraso o una pérdida de memoria?

¿Es lógicamente correcto resolverlo?confirmOwnership() con nulo para decir "no se encontró ningún recurso coincidente" y luego tratarlo como un error enauthorizeOwnership()? Mi primer intento rechazó la promesa enconfirmOwnership() cuando no había un recurso coincidente, pero esto hacía las cosas más complicadas porque es difícil distinguir entre esto (el caso 403) y un error real (el caso 500).

Respuestas a la pregunta(1)

Su respuesta a la pregunta