404 страница, когда коллекция не найдена с Promise.all в NodeJS (Express) - PullRequest
0 голосов
/ 04 ноября 2019

Я использую Promise.all() и спрашиваю URL в нескольких коллекциях Mongo.

Я понял, что некоторые URL отсутствуют.

Так что у меня есть страница 404, когда это так. Как избежать этого (как правило, это с коллекцией Annonce)? Чем я могу заменить Promise.all на?

const express = require('express');
const mongoose = require('mongoose');
const { ensureAuthenticated } = require('../helpers/auth');
const router = express.Router();

require('../models/Car');
const Car = mongoose.model('cars');

require('../models/Caratio');
const Caratio = mongoose.model('caratios');

require('../models/User');
const User = mongoose.model('users');

require('../models/Annonce');
const Annonce = mongoose.model('annonces');

router.get('/app/:cars_getroute', ensureAuthenticated, (req, res) => {
    Promise.all([Car.findOne({ cars_getroute: req.params.cars_getroute }),
                Caratio.findOne({ cars_getroute: req.params.cars_getroute }),
                Annonce.findOne({ cars_getroute: req.params.cars_getroute })])
        .then(result => {
            let [cars, caratios, annonces] = result;
}

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Как сказал Рафи, как только одно обещание не будет выполнено в Promise.all, оно будет отклонено.

Вы можете заменить Promise.all на Promise.allSettled, так чтоотклоненное обещание не повлияет (или не остановит) другие обещания.

Метод Promise.allSettled () возвращает обещание, которое разрешается после того, как все данные обещания были либо разрешены, либо отклонены, с массивомобъекты, каждый из которых описывает результат каждого обещания.

Имейте в виду, что Promise.allSettled довольно недавно и не поддерживается IE или Edge, а также более старыми версиями других браузеров.
Таблица совместимости

0 голосов
/ 04 ноября 2019

Promise.all - это все или ничего. Он разрешает один раз все разрешения в массиве или отклоняет их, как только одно из них отклоняется. один из альтернативных способов - отфильтровать ваши обещания, чтобы вы ожидали только разрешенных.

Promise.all([p1, p2, p3].map(toResultObject)).then((values) => {
    for (let i = 0; i < values.length; ++i) 
        if (!values[i].success) console.log("ERR: " + values[i].error);
        else console.log(values[i].result);
});

см. Avoiding-Promise-all-fail-fast-поведения

НОВЫЙ ОТВЕТ

router.get('/app/:cars_getroute', ensureAuthenticated, async (req, res) => {
    const promises = [
        Car.findOne({
            cars_getroute: req.params.cars_getroute
        }),
        Caratio.findOne({
            cars_getroute: req.params.cars_getroute
        }),
        Annonce.findOne({
            cars_getroute: req.params.cars_getroute
        })
    ]

    let [cars, caratios, annonces] = await Promise.all(promises.map(p => p.catch(e => null)))
})

Но, конечно, вы должны проверять каждое значение на обнуляемость.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...