ExpressJS链承诺多次调用next()函数

时间:2016-11-16 20:55:08

标签: javascript node.js express middleware es6-promise

我正在使用处理逻辑的中间件来在db中创建新用户。此功能只检查用户电子邮件是否已存在,如果没有,则创建新文档,否则只是向客户端发送错误。

此函数(下面)中的问题是,当数据库中已存在用户电子邮件时,下一个()中间件函数被调用两次

我可能只是不要将这两个承诺链接起来,只是在另一个承诺中使用承诺,但如果有人有一个很好的模式来解决这种错误处理,也许我的代码是错误的,或者我错过了一些承诺。

create: function(req, res, next) {

    // Check if email already exist
    userDB.byEmail(req.body.email).then(function(doc) {

        if (doc) {
            res.setError('This email already exists', 409);
            return next();
        }

        // Return other Promise
        return userDB.create(req.body);

    }).then(function(doc) {

        res.setResponse(doc, 200);
        return next();

    }).catch(function(err) {

        res.setError('Service seems to be unavailables', 503);
        return next();
    });
},
  

注意:我使用个人方法res.setError()或res.setResponse()   这只是帮助我管理请求状态,然后我使用res.send   下一个中间件功能

谢谢大家< 3

1 个答案:

答案 0 :(得分:0)

当您在.byEmail回调中.then时,您正在继续承诺链,因此res.setResponse(doc, 200)的下一个throw也会被调用。您需要通过if (doc) { const error = new Error('This email already exists'); error.status = 409; throw error; } // ... .catch(err => { res.setError(err.message, err.status); return next(); // you may not even want to do this in the case of errors }); 打破承诺链或在一个位置设置响应。

 NamespaceManager nsManager = NamespaceManager.CreateFromConnectionString(connectionString);
        nsManager.Settings.RetryPolicy = new RetryExponential(minBackoff: TimeSpan.FromSeconds(5),
                                                            maxBackoff: TimeSpan.FromSeconds(30),
                                                            maxRetryCount: 3);

        if (!nsManager.QueueExists(queueName))
        {
            nsManager.CreateQueue(queueName);
        }
        else
        {
            nsManager.DeleteQueue(queueName);
            nsManager.CreateQueue(queueName);
        }

        QueueClient client = QueueClient.CreateFromConnectionString(connectionString, queueName);


        client.RetryPolicy = new RetryExponential(minBackoff: TimeSpan.FromSeconds(15),
                                                         maxBackoff: TimeSpan.FromSeconds(600),
                                                         maxRetryCount: 3);
        for (int i = 0; i < 2000; i++)
        {
            UserCreationSubmitted creationMessage = new UserCreationSubmitted()
            {
                CreationStatus = "Step 1",
                Id = Guid.NewGuid(),
                UserName = "user number " + i,
                Userid = Guid.NewGuid()
            };

            BrokeredMessage message = new BrokeredMessage(creationMessage);
            client.Send(message);

        }