我正在使用处理逻辑的中间件来在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
答案 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);
}