- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在后端有一个发送状态的 API 201
如果通话成功并且有
提交的数据有任何错误,它会发送状态 422
(无法处理的实体)具有如下 json 响应:
{
"error": "Some error text here explaining the error"
}
此外,它还会发送
404
以防 API 由于某种原因无法在后端工作。
fetch("api_url_here", {
method: 'some_method_here',
credentials: "same-origin",
headers: {
"Content-type": "application/json; charset=UTF-8",
'X-CSRF-Token': "some_token_here"
}
})
.then(checkStatus)
.then(function json(response) {
return response.json()
})
.then(function(resp){
successCallback(resp)
})
.catch(function(error){
errorCallback(error);
});
//status function used above
checkStatus = (response) => {
if (response.status >= 200 && response.status < 300) {
return Promise.resolve(response)
} else {
return Promise.reject(new Error(response))
}
}
successCallback
在状态码
201
的情况下,函数能够以正确的 JSON 格式接收响应但是当我尝试在
errorCallback
中获取错误响应时(
status: 422
)它显示如下内容(在控制台中记录响应):
Error: [object Response]
at status (grocery-market.js:447)
当我尝试
console.log
将其包装在
new Error()
中之前的错误响应像这样,
checkStatus = (response) => {
if (response.status >= 200 && response.status < 300) {
return Promise.resolve(response)
} else {
console.log(response.json()) //logging the response beforehand
return Promise.reject(new Error(response.statusText))
}
}
我在控制台中得到以下 promise (
[[PromiseValue]]
属性实际上包含我需要的错误文本)
response.json()
在错误和成功的情况下?
json()
对错误响应的 promise 我能够得到正确的错误:
fetch("api_url_here", {
method: 'some_method_here',
credentials: "same-origin",
headers: {
"Content-type": "application/json; charset=UTF-8",
'X-CSRF-Token': "some_token_here"
}
})
.then(checkStatus)
.then(function json(response) {
return response.json()
})
.then(function(resp){
successCallback(resp)
})
.catch(function(error){
error.json().then((error) => { //changed here
errorCallback(error)
});
});
.json()
在错误情况下的响应?
最佳答案
简答
因为您对两次解析响应内容的假设是不正确的。在原始片段中,then
在 then(checkStatus)
之后满足错误条件时跳过。
长答案
一般来说,结构良好promise chain包括:
then
仅在实现 Promise catch
仅在拒绝 Promise finally
(可选)在 Promise 结算时运行(在 2 或 3 中)fetch
Fetch API 的方法
rejects only on network failures ,所以第一个
then
不管
status
响应的代码。您的第一个处理程序,
onFulfilled
回调返回一个已完成或被拒绝的 Promise。
then
链中的方法调用,通过调用
json
提取 JSON响应上的方法,然后将其作为 Promise 值传递给最后一个
then
successCallback
中使用的方法.
catch
方法调用,它接收值设置为
new Error(response)
的 Promise然后您立即传递给
errorCallback
.因此,后者接收到
Error
的实例。 ,其值为
Response
的实例从获取 API。
Error: [object Response]
,调用
toString
的结果
Error
实例上的方法.第一部分是构造函数名称,第二部分是内容的字符串标记(形式为 [type Constructor])。
201
、
404
、
422
)返回 JSON 响应,请将解析后的响应传递给已完成和已拒绝的 promise 。另外,请注意您不小心声明了
checkStatus
通过省略
var
在全局范围内,
const
, 或
let
关键词:
//mock Response object
const res = {
status: 200,
body: "mock",
async json() {
const {
body
} = this;
return body;
}
};
const checkStatus = async (response) => {
const parsed = await response.json();
const {
status
} = response;
if (status >= 200 && status < 300) {
return parsed;
}
return Promise.reject(new Error(parsed));
};
const test = () => {
return checkStatus(res)
.then(console.log)
.catch((err) => console.warn(err.message))
.finally(() => {
if (res.status === 200) {
res.status = 422;
return test();
}
});
};
test();
async
/ await
提供:
(() => {
try {
const response = await fetch("api_url_here", {
method: 'some_method_here',
credentials: "same-origin",
headers: {
"Content-type": "application/json; charset=UTF-8",
'X-CSRF-Token': "some_token_here"
}
});
const parsed = await response.json(); //json method returns a Promise!
const {
status
} = response;
if (status === 201) {
return successCallback(parsed);
}
throw new Error(parsed);
} catch (error) {
return errorCallback(error);
}
})();
parsed
JSON 内容到
Error()
构造函数,抽象
ToString
调用操作(参见 ECMA 规范的
step 3a)。
toString
方法,你会得到一个字符串标签,即
[object Object]
,导致错误处理程序无法访问对象的内容:
(() => {
const obj = { msg : "bang bang" };
const err = new Error(obj);
//will log [object Object]
console.log(err.message);
obj.toString = function () { return this.msg; };
const errWithToString = new Error(obj);
//will log "bang bang"
console.log(errWithToString.message);
})();
reject
带有作为参数传递的对象的 Promise,被拒绝的 Promise 的
[[PromiseValue]]
将是对象本身。
关于javascript - 如果出现 HTTP 错误 422,如何使用 fetch 获取响应正文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63408816/
我正在运行此代码并在没有互联网连接的情况下进行测试: fetch(url, options) .then(res => { // irrelevant, as catch happens
function fetchHandler(evt) { console.log('request:' + evt.request.url); dealWithRequest(evt)
我在 AdventureWorks2016 上执行了两个示例查询,并得到了相同的结果。那么什么时候应该使用 NEXT 或 FIRST 关键字? select LastName + ' ' + Firs
我有以下查询: @Query("SELECT new de.projectemployee.ProjectEmployee(employee) " + "FROM ProjectEmpl
我正在尝试使用 fetch on react 来实现客户端登录。 我正在使用护照进行身份验证。我使用的原因 fetch而不是常规 form.submit() , 是因为我希望能够从我的快速服务器接收错
我正在尝试将我的 Aurelia 项目从 beta 版本升级到 3 月版本。 我遇到的错误之一是: Cannot find name 'Request'. 谷歌搜索会在 GitHub 上显示此问题:h
见标题。在我们的react项目中调用fetch时,一位(现已离职)开发人员最初使用from fetch to window.fetch。我不确定两者之间的区别,也无法在网上找到任何结论(W3Schoo
这个问题在这里已经有了答案: HTTP status code 401 even though I’m sending credentials in the request (1 个回答) How
这是代码片段: var fetch = require("node-fetch"); var fetchMock = require("fetch-mock"); function setupMock
我在这里看到了两种不同的抓取方式: https://github.com/github/fetch https://github.com/matthew-andrews/isomorphic-fetc
以下git命令有什么区别? git fetch origin 和 git fetch --all 从命令行运行它们看起来就像它们做同样的事情。 最佳答案 git fetch origin 仅从 ori
我有一个不断改变值的动态 json。我想用该数据绘制图表所以我将动态数据存储到数组然后用该数组绘制图表。目前我创建了 serinterval 用于从 api 获取新数据。但问题是如果新数据没有,它会再
我有一个很大的 JSON blob,我想预先加载我的网页。为此,我添加了 到我的页面。我也有一个 JS 请求来获取相同的 blob。 这不起作用,控制台报告: [Warning] The resour
我们在单页 JavaScript 应用程序发出 fetch 请求时遇到不一致的客户端错误。值得注意的是,它们都是同源请求。 let request = new Request(url, options
我是 ReactJS 的新手,我一直在阅读如何从 api 获取和发布数据。我见过这两个,但我不知道该用什么以及两者之间有什么区别?我读了它,但我不确定我会用什么。谢谢! react-fetch wha
Doctrine中注解@ManyToOne中的fetch="EAGER"和fetch="LAZY"有什么区别? /** * @ManyToOne(targetEntity="Cart", casca
我想要获取一个 api,然后调用另一个 api。在 javascript 中使用这样的代码是否明智? fetch(url, { method: 'get', }).then(function(re
我有一个组件,它依赖于 2 个端点来检索所需程序的名称。我有 2 个端点。第一个端点返回程序列表,它是一个对象数组。目前,它仅返回 4 个节目(2 个节目 ID 为“13”,另外两个节目 ID 为“1
我的应用程序从外部源(配置文件)接收查询,因此它必须从查询结果中获取列。我有一些代码: typedef union _DbField { text text[512]; sword i
我有一个实体A,它与实体B有对多关系。 Entity A -->> Entity B 我需要在多个屏幕上引用一对多关系的计数。此外,我可以多次从 Entity A
我是一名优秀的程序员,十分优秀!