Javascript Express.js中未处理的Promiser弹出

Javascript Express.js中未处理的Promiser弹出,javascript,express,Javascript,Express,我希望我为这个问题提供了足够的信息,但我不明白为什么我的回调函数在我有意捕获错误时返回未处理的承诺拒绝: (node:3144) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Can't set headers after they are sent. (node:3144) DeprecationWarning: Unhandled promise rejectio

我希望我为这个问题提供了足够的信息,但我不明白为什么我的回调函数在我有意捕获错误时返回未处理的承诺拒绝:

(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.
我在routes中调用此函数:

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

        CreateSnippetResource(req, function(err) {

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

            res.redirect("/home")
        });
    });
以及“CreateSippetResource”-函数:

(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");
实际上,从回调
CreateSnippetResource
返回的错误消息是
标题是空的
。那我怎么会犯这个承诺错误呢

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

当我有意捕获错误时,为什么回调函数返回
未处理的承诺拒绝


当您的
回调
引发另一个异常时,就会发生这种情况。这将拒绝
.catch(…)
调用返回的承诺,而拒绝没有得到处理。

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

首先要解决的问题是
回调的不正确用法,如果您调用回调两次,则返回错误。
callback
callback(User.findOne…
)的第一次调用肯定是错误的,在这里,您使用
User.findOne
的结果调用您的回调,因此如果发生错误,将在第二次调用它并
res.redirect(“/home”)
将执行两次,导致
错误:发送头后无法设置头。
。您应该删除成功回调的第一个位置:
snippet.save()。然后(function(){callback();return null;})。catch(
@t.niese事实证明,我是个白痴,忘了我不小心把它都放在了回调中。谢谢提醒