lzxb / vue-cnode

基于vue2 + vue-router + vuet + ES6 + less + flex.css重写vue版cnode社区,使用webpack2打包
1.12k stars 314 forks source link

关于post请求的问题 #33

Closed cw84973570 closed 6 years ago

cw84973570 commented 6 years ago

请问为什么你的post请求失败了还有返回值,而我发送的post请求失败了就直接跳到错误处理代码了? 例如发布主题的post请求: 我的代码:

async createTopic (context) {
  const data = { accesstoken: context.state.accessToken, ...context.state.topicForm}
  try {
    const res = await axios({
        method: 'post',
        url: '/topics',
        data: data
     })
    context.commit(types.CREATE_TOPIC, res)
  } catch (error) {
    // 请求失败没有返回res对象,直接跳到这里
    console.log(error)
  }
}

你的代码:

async create () {
  const res = await http.post(`/topics`, {
      ...this.state
  })
  if (res.success) {
    this.reset()
       this.app.$router.push({
         path: `/topic/${res.topic_id}`
       })
    } else {
       // 请求失败的res: {success: false, error_msg: "频率限制:当前操作每天可以进行 7 次"}
       utils.toast(res.error_msg)
    }
    return res
}
lzxb commented 6 years ago

看一下你报的错误吧,我使用的是fetch,你使用的是axios,可能有些地方不一样的

cw84973570 commented 6 years ago

看了下MDN好像是这样

请注意,fetch规范与jQuery.ajax()主要有两种方式的不同,牢记:

当接收到一个代表错误的 HTTP 状态码时,从 fetch()返回的 Promise 不会被标记为 reject, 即使该 HTTP 响应的状态码是 404 或 500。相反,它会将 Promise 状态标记为 resolve (但是会将 resolve 的返回值的 ok 属性设置为 false ),仅当网络故障时或请求被阻止时,才会标记为 reject。 默认情况下,fetch 不会从服务端发送或接收任何 cookies, 如果站点依赖于用户 session,则会导致未经认证的请求(要发送 cookies,必须设置 credentials 选项)。

感谢你的解答。

lzxb commented 6 years ago

ok