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