在NodeJS(Express)中用Promise.all未找到集合时的404页

时间:2019-11-04 08:53:03

标签: javascript node.js express

我使用Promise.all()并在多个Mongo集合中询问URL。

我意识到缺少某些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 :(得分:0)

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-behavior

新答案

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

但是您当然应该检查每个值的可为空性。

答案 1 :(得分:0)

如拉菲所说,sapper.beforeRouteChange((to, from, next) => { const isAuth = "[some session or token check]"; if (!isAuth) { next('/login') } next() }) 中的一个诺言一旦失败,就会被拒绝。

您可以将Promise.all替换为Promise.allSettled,这样被拒绝的承诺不会影响(或停止)其他承诺。

  

Promise.allSettled()方法返回一个承诺,该承诺在所有给定的承诺均已解决或被拒绝后解决,并带有一个对象数组,每个对象描述每个承诺的结果。

请记住,Promise.all是相当新的版本,IE或Edge以及其他浏览器的旧版本均不支持。
Compatibility table