未处理的承诺拒绝:错误:请求失败,状态代码为500

时间:2017-12-29 22:30:30

标签: react-native react-redux

我正在尝试调用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});   
}
}   

2 个答案:

答案 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);
     });
   }
}