我正在尝试调用api,我收到错误“Unhandled promise rejection:Error:Request failed with status code 500”。我不知道我是怎么得到错误的。我把api调用放在componentDidMount中。我不确定错误是来自redux实现还是来自我调用api的方式。
这就是我打电话给api的方式。成功登录后,我将用户名作为令牌,并用它来调用另一个api。
state={
username: '',
semcode: [
{}
]
}
componentWillMount() {
AsyncStorage.getItem('Login_token').then((token) => {
console.log('this is coursescreen',token);
let Login_token = token;
this.setState({ username: Login_token });
});
}
componentDidMount(){
this.props.getSemcode(this.state.username);
}
componentWillReceiveProps(nextProps) {
console.log('xx',nextProps);
if (nextProps.semCode != undefined) {
this.setState({ semcode: nextProps.semCode });
}
}
这就是我编写动作文件的方式:
export const getSemcode = (username) => async dispatch => {
let param = {
nomatrik: username,
}
console.log(`${helper.ROOT_URL}/result/GetListOfKodSesiSem`)
let code_res = await
axios.post(`${helper.ROOT_URL}/result/GetListOfKodSesiSem`, param)
console.log(code_res.data);
if (code_res.data.length > 0) {
const { code } = code_res.data;
dispatch({ type: SEMCODE_FETCH_SUCCESS, payload: { semCode: code }});
}
}
这就是我写减速器的方法:
import { SEMCODE_FETCH_SUCCESS} from '../actions/types';
const INITIAL_STATE={
semCode:[],
}
export default function (state=INITIAL_STATE, action){
switch(action.type){
case SEMCODE_FETCH_SUCCESS:
return action.payload
default:
return state;
}
}
任何人都可以帮助我了吗
错误消息
从axios.post收到错误:{“config”:{“transformRequest”: {}, “transformResponse”:{}, “超时”:0, “xsrfCookieName”:“XSRF- TOKEN”, “xsrfHeaderName”: “X-XSRF-TOKEN”, “maxContentLength”: - 1, “头”: {“接受”:“application / json,text / plain, / ”,“内容 - 类型 “:” 应用/ JSON;字符集= UTF-8" }, “方法”: “后”, “nomatrik”: “BB16160907” “URL”: “https://smp.ums.edu.my/api/result/GetListOfKodSesiSem”, “数据”:” {\ “接受\”:\ “应用程序/ JSON \”,\“内容 - 类型\ “:\” 应用程序/ JSON \ “}”}, “请求”: { “UNSENT”:0, “打开的”:1, “HEADERS_RECEIVED”:2, “加载”:3, “DONE”:4, “的readyState”:4, “状态”:500, “超时”:0, “withCredentials”:真正的 “上传”: {}, “_中止”:假, “_ hasError”:假, “_方法”: “POST”, “_响应”:” {\“消息\”:\“发生错误。\”}“, “_url”: “https://smp.ums.edu.my/api/result/GetListOfKodSesiSem”, “_timedOut”:假, “_ trackingName”: “未知”, “_incrementalEvents”:false,“responseHeaders”:{“日期”:“星期六,2017年12月30日 三时58分25秒 GMT “ ”内容长度“: ”36“, ”X-已启动的所谓“: ”ARR / 3.0“,” X-AspNet- 版本 “:” 4.0.30319" , “过期”: “ - 1”, “内容类型”:“应用/ JSON; 字符集= UTF-8" , “服务器”: “微软IIS / 10.0”, “杂注”: “无缓存”,“的cache 控制 “:” 无缓存 “},” _的requestId “:空,” _头“: {“accept”:“application / json,text / plain, / ”,“content- 类型 “:” 应用/ JSON;字符集= UTF- 8 “},” _ responseTyp的 “:” “ ”_派“:真实的, ”_ lowerCaseResponseHeaders“:{ ”日期“:” 星期六, 2017年12月30日03:58:25 GMT “ ”内容长度“: ”36“, ”X-通电用“: ”ARR / 3.0“,” X- ASPNET版本 “:” 4.0.30319" , “过期”: “ - 1”, “内容类型”:“应用/ JSON;字符集= UTF-8" , “服务器”: “微软IIS / 10.0”, “编译”: “无缓存”,“的cache 控制 “:” 无缓存 “},” _预订 “:[],” responseURL“: “https://smp.ums.edu.my/api/result/GetListOfKodSesiSem”}, “响应”:{ “数据”: {“消息”:“错误有 发生了。“},”status“:500,”headers“:{”date“:”Sat,2017年12月30日03:58:25 GMT “ ”内容长度“: ”36“, ”X-通电用“: ”ARR / 3.0“,” X- ASPNET版本 “:” 4.0.30319" , “过期”: “ - 1”, “内容类型”:“应用/ JSON;字符集= UTF-8" , “服务器”: “微软IIS / 10.0”, “编译”: “无缓存”,“的cache 控制 “:” 无缓存 “},” 配置 “:{” transformRequest “:{},” transformResponse“: {}, “超时”:0, “xsrfCookieName”: “XSRF-TOKEN”, “xsrfHeaderName”:“X-XSRF- TOKEN “ ”maxContentLength“: - 1, ”头“:{ ”接受“:” 应用/ JSON, text / plain的, / “,”Content-Type“:”application / json; charset = utf-8“},”method“:”post“,”nomatrik“:”BB16160907“, “URL”: “https://smp.ums.edu.my/api/result/GetListOfKodSesiSem”, “数据”:” {\ “接受\”:\ “应用程序/ JSON \”,\“内容 - 类型\ “:\” 应用程序/ JSON \ “}”}, “请求”: { “UNSENT”:0, “打开的”:1, “HEADERS_RECEIVED”:2, “加载”:3, “DONE”:4, “的readyState”:4, “状态”:500, “超时”:0, “withCredentials”:真正的 “上传”: {}, “_中止”:假, “_ hasError”:假, “_方法”: “POST”, “_响应”:” {\“消息\”:\“发生错误。\”}“, “_url”: “https://smp.ums.edu.my/api/result/GetListOfKodSesiSem”, “_timedOut”:false,“_ trackingName”:“unknown”,“_ incrementalEvents”:false,“responseHeaders”:{“Date”:“Sat,2017年12月30日03:58:25 GMT”,“内容 - 长度 “:” 36" , “X-已启动的所谓”: “ARR / 3.0”,“X-AspNet- 版本 “:” 4.0.30319" , “过期”: “ - 1”, “内容类型”:“应用/ JSON; 字符集= UTF-8" , “服务器”: “微软IIS / 10.0”, “杂注”: “无缓存”,“的cache 控制 “:” 无缓存 “},” _的requestId “:空,” _头“: {“accept”:“application / json,text / plain, / ”,“content- 类型 “:” 应用/ JSON;字符集= UTF- 8 “},” _ responseTyp的 “:” “ ”_派“:真实的, ”_ lowerCaseResponseHeaders“:{ ”日期“:” 星期六, 2017年12月30日03:58:25 GMT “ ”内容长度“: ”36“, ”X-通电用“: ”ARR / 3.0“,” X- ASPNET版本 “:” 4.0.30319" , “过期”: “ - 1”, “内容类型”:“应用/ JSON;字符集= UTF-8" , “服务器”: “微软IIS / 10.0”, “编译”: “无缓存”,“的cache 控制“:”无缓存“},” _订阅“: [], “responseURL”: “https://smp.ums.edu.my/api/result/GetListOfKodSesiSem”}}}
登录操作:
export const attemptLogin = (username, password) => async dispatch => {
let param = {
txtNomatrik: username,
txtPwd: password,
public_key: helper.PUBLIC_KEY,
secret_key: helper.SECRET_KEY
}
console.log(`${helper.ROOT_API_URL}/v1/basic/ad/std/login`)
let login_res = await
axios.post(`${helper.ROOT_API_URL}/v1/basic/ad/std/login`, param)
console.log(login_res.data);
await AsyncStorage.setItem('jwtToken',login_res.data.token);
if (login_res.data.status == 'Successful login') {
const { login } = login_res.data;
dispatch({ type: LOGIN_SUCCESS});
}
}
答案 0 :(得分:2)
你看错了地方。
当远程服务器无法处理请求时,将返回错误代码500。在这种情况下,我怀疑${helper.ROOT_URL}/result/GetListOfKodSesiSem
的POST失败了。 axios库是一个基于promise的库。将调用包装在try-catch块中,如下所示:
try {
console.log(`${helper.ROOT_URL}/result/GetListOfKodSesiSem`)
let code_res = await
axios.post(`${helper.ROOT_URL}/result/GetListOfKodSesiSem`, param)
console.log(code_res.data);
if (code_res.data.length > 0) {
const { code } = code_res.data;
dispatch({ type: SEMCODE_FETCH_SUCCESS, payload: { semCode: code }});
}
} catch (err) {
console.error(`Error received from axios.post: ${JSON.stringify(err)}`);
}
这至少会在调试控制台中为您提供有关正在发生的事情的视图。然后,您可以使用后端的任何调试日志来协调该调用,以找出错误的真实情况。
然而,您的根本原因是远程服务器正在向您的客户端返回服务器错误(HTTP代码500)。
答案 1 :(得分:1)
<强>问题强>
您的请求失败,因为您没有将JWT令牌添加到标题中。
<强>解决方案强>
使用Axios和您的代码,这应该工作。显然我们这里的一个大问题是,即使它是空的,你也必须通过data
。如果我们未通过data
,则会失败并显示error 500
。
export const getSemcode = (username) => async dispatch => {
let jwtToken = await AsyncStorage.getItem('jwtToken').then((data) => {
console.log('this is semcode',data);
});
let config = {
method: 'POST',
url: 'url/to/sem',
headers: {
'content-type': 'application/x-www-form-urlencoded',
AntiTemperSignature: jwtToken,
UserID: '123456',
},
data: '',
json: true
};
try {
return axios(config)
.then((response) => {
console.log(response);
if (response.data.length > 0) {
const { code } = response.data;
dispatch({ type: SEMCODE_FETCH_SUCCESS, payload: { semCode: code } });
}
})
.catch((error) => {
console.log(error);
});
}
}