当前位置: 首页 > 知识库问答 >
问题:

Nodejs未处理的promise

戚阳文
2023-03-14

我一直得到“UnhandledPromiseRejectionWarning:UnhandledPromiseRejection.此错误源于在没有catch块的异步函数内部抛出,或拒绝未用.catch()处理的Promission.(拒绝ID:2)”

我已经处理了所有的承诺,但错误仍然存在

    const router =require('express').Router();
const User = require('../modules/user');
const auth = require('../authenticate/auth');

router.post('/create', auth, async(req,res, next)=>{
    let uid = req.user.uid;
    try{
        await User.findById(uid)
        .then(user=>{
             user.Business.forEach(business => {
                 if(business._id == req.body.buId ){
                    console.log(business._id)
                    business.items.push(req.body);
                    user.save()
                    .then(user=>{
                        res.json(user);
                    },(err) => next(err))
                    .catch(err=>{
                        res.json({err})
                    })
                 }
                 else{
                    res.statusCode = 400;
                    res.setHeader('content-type', 'application/json');
                    res.json({err, message:'no such business exist'})
                 }
             });  
        },(err) => next(err))
        .catch (err=>{
            res.json({err, message:'user do not exist'})
        })
    }
    catch (err){
        res.send(err)
    }

})

module.exports= router;

共有2个答案

汪弘毅
2023-03-14

显然promise在循环函数中不能很好地工作。将其存储在可变变量函数中。

const router =require('express').Router();
const User = require('../modules/user');
const auth = require('../authenticate/auth');

router.post('/create', auth, (req,res, next)=>{
    let uid = req.user.uid;
    try{
        User.findById(uid)
        .then(user=>{
             let business = ()=>{
                for (let index = 0; index < user.Business.length; index++) {
                   if(user.Business[index]._id == req.body.buId ){
                     return user.Business[index];
                   }
                }
            }
            business().items.push(req.body);
            user.save()
            .then(user=>{
                res.json(user);
            },(err) => next(err))
            .catch(err=>{
                res.json({err})
            })
        },(err) => next(err))
        .catch (err=>{
            res.json({err, message:'user do not exist'})
        })
    }
    catch (err){
        res.send(err)
    }

})

module.exports= router;
戚俊健
2023-03-14

首先,由于您正在user.findbyid和user.save中使用Promise,因此不需要“async”和“await”关键字。您正在使用.catch块处理该错误。

其次,您正在使用一个for Each循环,该循环内部有promise,它将无法工作。使用normal for loop或任何其他。

 类似资料:
  • 当下面的代码错误(拒绝其promise)时,我会收到警告。HTTP函数似乎错误很好。我想,本身一定发生了什么事情,这在某种程度上避免了try-catch。 有人能开导我吗?(这是在几次尝试改变事情以使其工作之后。) NodeJS 11.13.0

  • 当我运行部署我的应用程序的命令时,我发现以下错误 (节点: 6292)UnhandledPromiseRejtionWarning: UnHandledPromiseRejtionWarning: UnHandledPromiseRejtionWarning: UnHandledPromiseRejtionWarning: UnHandledPromiseRejtionWarning: UnHan

  • 当我的角度前端发送请求时 我的nodejs服务器接收它 我添加了setTimeout,因为如果没有它,我就会得到错误:状态代码400请求失败。 因此,我可以发布订单到,但得到promise拒绝。 (节点:9220)UnhandledPromiseRejtionWarning:未处理的promise拒绝。这个错误要么是由于抛出一个没有捕获块的异步函数,要么是由于拒绝了一个没有用. cat()处理的p

  • 问题内容: 将NodeJS与MongoDB + Mongoose结合使用。 首先,我知道异步非阻塞代码的优点。所以我确实处理回调。但是最后我遇到了以下问题。 可以说我有一个可以随时被用户调用的函数。超级“闪电般的”用户可能几乎同时调用两次。 当然它是这样执行的:查找查询,查找查询,保存查询,保存查询 这完全破坏了应用程序的逻辑(应查找查询,保存查询,查找查询,保存查询)。因此,我决定通过“锁定”特

  • 我主要是为技术精明的人编写一个小工具,例如程序员、工程师等,因为这些工具通常是快速的,随着时间的推移,我知道会有未处理的异常,用户不会介意。我希望用户能够向我发送回溯,这样我就可以检查发生了什么,并可能改进应用程序。 我通常做wxPython编程,但我最近做了一些Java。我已经将