gpt4 book ai didi

javascript - 使用 BreezeJsexecuteQuery 处理 WebApi 抛出的异常(未处理的拒绝原因)

转载 作者:行者123 更新时间:2023-12-03 10:20:14 25 4
gpt4 key购买 nike

我在 MVC 应用程序中使用 Breeze.js 和 Q.js。

我目前在我的 webApi 上有一个操作

public IQueryable<Myobject> doMyAction()

这可以做两件事:

  • 返回对象集合(如果用户允许)
  • 抛出HTTP异常(如果用户不允许)(可能不是“未授权”,这只是一个例子)

    throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.Unauthorized, "Not Allowed"));

这个 Action 是通过 javascript 调用的,带有:

var query = EntityQuery.from('doMyAction');

// execute the query
dcCore.manager.executeQuery(query)
.then(querySucceeded)
.fail(dcCore.queryFailed);

如果用户已获得授权并且逻辑正确,那么我将连接到我的数据库并返回一个不错的 Myobject() 列表,一切都很好。

但是,如果我抛出异常来表明它们未经授权,那么在控制台中我会收到 401(未经授权)和消息:

[Q] Unhandled rejection reasons (should be empty):

这发生在调用 .fail() 函数之前。

我还尝试在整个执行位周围放置一个 try/catch,希望能够捕获错误,但没有运气。

我可以明白为什么理论上会发生这种情况,因为我没有返回executeQuery所期望的东西(事实上,我根本没有返回,我正在抛出!),但是,

-实际问题

我应该如何用 Breeze 处理从 webApi 返回的错误,而不需要执行扩展模型之类的操作?

我唯一尚未尝试的事情是让我的 Web API 返回一种动态或通用对象,但这感觉不是最好的解决方案。

最佳答案

为此,您有两种方法,第一种是直接在查询方法中直接抛出一个简单的异常,即如下所示:

[HttpGet]
public IQueryable<Customer> CustomersStartingWith(string companyName) {
if (companyName == "null") {
throw new Exception("nulls should not be passed as 'null'");
}
...
}

或者,如果您想对 HTTPResponse 进行更多控制,您可以执行以下操作:

[HttpGet]
public IQueryable<Customer> CustomersWithHttpError() {
var responseMsg = new HttpResponseMessage(HttpStatusCode.NotFound);
responseMsg.Content = new StringContent("Custom error message");
responseMsg.ReasonPhrase = "Custom Reason";
throw new HttpResponseException(responseMsg);
}

请注意,对于保存操作(与上述查询操作相反),最好的方法是抛出EntityErrorsException。 (请参阅文档),尽管抛出一个简单的异常仍然有效。

希望这有帮助。

关于javascript - 使用 BreezeJsexecuteQuery 处理 WebApi 抛出的异常(未处理的拒绝原因),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29677872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com