【问题标题】:Problem with axios post request from Nuxt.js to external API从 Nuxt.js 到外部 API 的 axios 发布请求的问题
【发布时间】:2020-07-17 17:15:12
【问题描述】:

我现在尝试了好几个小时,从 Nuxt 向我的外部 api 发送一个简单的发布请求。

单独的节点实例按预期工作,我可以根据需要使用以下内容进行 POST 和 GET:

const headers = {
  'Content-Type': 'application/json',
  'access-token': 'myTokenXYZ123'
};
const data = { test: 'Hello!' };

const postSomething = () => {
  axios.post('https://myapidomain.com/api', data, {
    headers: headers
  });
};
postSomething();

还有 curl

curl -X POST -H 'access-token: myTokenXYZ123' -H 'Content-Type: application/json' -d '{ "test": "Hello!" }' https://myapidomain.com/api

到目前为止一切顺利,现在我想在我的 Nuxt 项目中实现它。我必须先设置一个 http 代理,我在 nuxt.config.js 中这样做是这样的:

[...]

modules: [
    '@nuxtjs/axios',
    '@nuxtjs/proxy'
  ],
  proxy: {
    '/my-api/': { target: 'https://myapidomain.com/api', pathRewrite: {'^/my-api/': ''} },
  },
  axios: {
    proxy: true
  },

[...]

我非常有信心代理正在工作,因为我可以通过以下方法获取数据:

methods: {
  async getSomething() {
    let requested = await this.$axios.get('/my-api/', {
       headers: this.headers
    });
    return requested.data;
  }
}

但无论我做什么,POST 请求都不起作用。我就是这样尝试的:

methods: {
  postSomething() {
    const data = { test: 'Hello!' };

    this.$axios.post('/my-api/', data, {
      headers: {
        'Content-Type': 'application/json',
        'access-token': 'myTokenXYZ123'
      }
    });
  }
}

我尝试了各种不同的格式,例如像这样:

methods: {
  postSomething() {
    const headers = {
      'Content-Type': 'application/json',
      'access-token': 'myTokenXYZ123'
    };
    const data = { test: 'Hello!' };
    const options = {
      method: 'post',
      url: '/my-api/',
      data: data,
      transformRequest: [(data, headers) => {
        return data;
      }]
    };
    this.$axios(options);
  }
}

但它似乎不起作用。请求正在运行并在一段时间后中止,终端中出现以下错误:

ERROR  [HPM] Error occurred while trying to proxy request  from localhost:3000 to https://myapidomain.com/api (ECONNRESET) (https://nodejs.org/api/errors.html#errors_common_system_errors)

我已经尝试过的其他一些方法:

  • 在本地运行 API 和 Nuxt

  • 使用在模板中导入的 axios 并作为 nuxt 模块

  • 来自已构建和生产版本的请求

  • 异步和同步方法

重现步骤:

# Download and start API server
git clone https://github.com/consuman/api-demo.git
cd api-demo/
npm install
node src

# In a second terminal download and start Nuxt server
git clone https://github.com/consuman/api-demo-nuxt.git
cd api-demo-nuxt
npm install
npm run dev

# Navigate to http://localhost:3000
# Relevant code is in /api-demo-nuxt/pages/index.vue

要测试,如果 API 工作正常,您可以使用 curl 进行 POST:

curl -X POST -H 'access-token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjaGVjayI6dHJ1ZSwiaWF0IjoxNTg2MTYzMjAxLCJleHAiOjE2MTc2OTkyMDF9.vot4mfiR0j6OewlJ0RWgRksDGp-BSD4RPSymZpXTjAs' -H 'Content-Type: application/json' -d '{ "testData": "Hello from API, posted from curl, please overwrite me!" }' http://localhost:3001/api

感谢您的阅读。任何提示将不胜感激!

【问题讨论】:

    标签: javascript node.js axios http-post nuxt.js


    【解决方案1】:

    希望您使用@nuxtjs/axios 模块,如果是,那么您可以使用拦截器

    https://axios.nuxtjs.org/helpers.html#interceptors

    export default function ({ $axios, redirect }) {
      $axios.onRequest(config => {
        config.headers.common['Authorization'] = `Bearer token`;
      })
    
      $axios.onError(error => {
        if(error.response.status === 500) {
          redirect('/sorry')
        }
      })
    }
    

    这样你就可以共享你的 axios 代码了。

    关于您的帖子请求,您能否分享更多详细信息或任何工作示例!!!

    【讨论】:

    • 感谢您的回答!不幸的是,这并不能解决我的问题。我正在尝试从 Nuxt 将帖子发布到我的 api。使用拦截器我遇到了同样的问题。我在问题的底部添加了一个“有效”的解决方案。目标是让该按钮发挥作用。
    • 我的示例正在运行。不过还是谢谢你:)
    【解决方案2】:

    我发现了问题。配置了一个服务器中间件,不再需要了。它在每个 POST 请求时触发。

    愚蠢的错误,但这就是你的学习方式,对吧? xD

    重现的步骤现在是一个工作演示,以防万一有人需要类似的东西。

    干杯!

    这里又是工作演示:

    # Download and start API server
    git clone https://github.com/consuman/api-demo.git
    cd api-demo/
    npm install
    node src
    
    # In a second terminal download and start Nuxt server
    git clone https://github.com/consuman/api-demo-nuxt.git
    cd api-demo-nuxt
    npm install
    npm run dev
    
    # Navigate to http://localhost:3000
    # Relevant code is in /api-demo-nuxt/pages/index.vue
    

    【讨论】:

      【解决方案3】:

      如果您在 nuxt 中使用 axios 时遇到问题。确保您可以通过导入或上下文访问 axios 本身。

      import axios from "@nuxtjs/axios";
      const res = await axios.post('/api/v1/auth', {email, password });
      

      或上下文

      // For methods and vuex, you have access to 'this'
      const res = await this.$axios.$post('/api/v1/auth', {email, password });
      
      // For nuxt middleware, you have access to 'context'
      const res = await context.$axios.$get('/api/v1/user');
      

      包括标题

      this.$axios.defaults.headers.common["Authorization"] = `Bearer ${token}`;
      

      最后,确保您正在控制台记录服务器端点(中间件和路由),以确保您正确处理所有内容。

      【讨论】:

        【解决方案4】:

        就我而言,我将触发按钮放在表单中。这触发了函数(我称之为 axios)调用以及通常在您发送 From 时发生的 XHR 调用。

        为了修复它并且只触发 axios 调用,只需将按钮从 Form 标签上取下即可。

        【讨论】:

          猜你喜欢
          • 2019-11-19
          • 1970-01-01
          • 2020-05-22
          • 1970-01-01
          • 1970-01-01
          • 2022-12-10
          • 2020-04-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多