2017-02-28 19 views
0

我希望我对这个问题提供足够的信息,但我不明白为什么我的回调函数返回未处理的承诺拒绝时,我故意想赶上错误:UnhandledPromiseRejection在Express.js

(node:3144) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Can't set headers after they are sent. 
(node:3144) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code. 

我在这里调用该函数在路线:

router.route("/home/create") 
    .post(Authorization, function(req, res) { 

     CreateSnippetResource(req, function(err) { 

      if (err) { 
       console.log(err.message) 
      } 

      res.redirect("/home") 
     }); 
    }); 

与 “CreateSnippetResource” - 函数:

(function() { 

    let User = require("../../Models/User"); 
    let Snippet = require("../../Models/Snippet"); 

    /** 
    * Create a new snippet and save it to database 
    * @param request 
    * @param callback 
    */ 
    module.exports = function(request, callback) { 

     callback(
      User.findOne({ user: request.session.Auth.username }, function(err, user) { 
       if (err || user === null) { 
        callback("User not found") 
       } 

       var snippet = new Snippet({ 
        title: request.body.snippetName.split(".").shift(), 
        fileName: "." + request.body.snippetName.split(".").pop(), 
        postedBy: user._id, 
        snippet: [{ 
         text: " " 
        }] 
       }); 

       snippet.save().then().catch(function(err) { 

        callback(err) 
       }); 
      })) 
    }; 
}()); 

我试图在未输入标题时处理错误。我在我的架构模块验证程序看起来像这样:

SnippetSchema.path("title").validate(function(title) { 
    return title.length > 0; 
}, "The title is empty"); 

事实上返回的错误消息从回调CreateSnippetResourceThe title is empty。那么,我如何得到这个Promise-error?

我假设它与我如何处理snippet.save()有关,但无法看到它是如何处理的。你能帮忙吗?

+1

第一件事你应该解决它的错误使用你的'回调'在错误的情况下你调用你的回调两次。 'callback'('callback(User.findOne ...)')的第一个调用肯定是错误的,那么你调用你的回调并返回User.findOne'的结果,所以如果发生错误,它会被调用第二次和'res.redirect(“/ home”)'将被执行两次,导致'错误:发送后无法设置标题。你应该删除第一个放置成功'callback'的地方:'snippet.save()。then(function(){callback(); return null;}).catch('。 –

+0

@ t.niese事实证明, ,我是一个白痴,忘记了我无意中把它全部放在了回调中,谢谢你的提醒 – Jesper

回答

0

Why does my callback function return Unhandled Promise Rejection when I on purpose want to catch the error?

当您的callback引发另一个异常时会发生这种情况。这将拒绝.catch(…)呼叫返回的承诺,并且拒绝无法处理。

1

事实证明,我是一个白痴,忘记了我不小心把整个函数放在回调函数中。该回调然后执行两次,并因此返回错误:发送后无法设置标头。