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

Javascript 404在NodeJS(Express)中未找到Promise.all集合时的页面,javascript,node.js,express,Javascript,Node.js,Express,我使用Promise.all()并在多个Mongo集合中询问URL 我意识到有些URL丢失了 因此,在这种情况下,我有一个404页面。如何避免这种情况(通常是使用Annonce集合)?我可以用什么来取代所有的承诺 const express = require('express'); const mongoose = require('mongoose'); const { ensureAuthenticated } = require('../helpers/auth'); const rou

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

我意识到有些URL丢失了

因此,在这种情况下,我有一个404页面。如何避免这种情况(通常是使用Annonce集合)?我可以用什么来取代所有的承诺

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

承诺。全部
要么全有,要么全无。一旦数组中的所有承诺都解决,它就会解决,或者一旦其中一个承诺被拒绝,它就会拒绝。另一种方法是过滤你的承诺,这样你就只能等待得到解决的承诺

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

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

正如拉菲所说,只要一个承诺在
承诺中失败。所有的
,它都将被拒绝


您可以用替换
承诺。所有
,以便被拒绝的承诺不会影响(或停止)其他承诺

allsolited()方法返回一个承诺,该承诺在所有给定承诺都已解析或拒绝后解析,其中包含一个对象数组,每个对象描述每个承诺的结果

请记住,
Promise.allsolited
是最近推出的,IE或Edge以及其他浏览器的旧版本不支持它。

你说缺少某个URL是什么意思?我没有找到带有
Annonce的
cars\u getroute
。findOne
(因为没有,我不想绝对找到它)如果
Annonce.findOne
不返回文档,那么
annonces
变量将为空。我看不出得到404有什么关系。这就是问题所在,之后我尝试查找
annonces.number
例如,我的渲染中有一个错误,因为它为空。您可以用Yes替换
Promise.all
,谢谢您的回答,我怀疑这不是一个好办法。你知道我可以用什么来代替承诺吗?看看我的新答案。你觉得有用吗?如果没有,请告诉我,以便我能提供帮助。因为我简化了我的问题,所以它不起作用。事实上,我还有其他变量和渲染。我有一个渲染错误。
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)))
})