【问题标题】:VueJS Axios chain request dynamic array vs static array errorVueJS Axios链请求动态数组vs静态数组报错
【发布时间】:2021-09-25 15:21:14
【问题描述】:

我的项目快速概览: 向正在创建订单(可以是单个或多个订单)的第 3 方 API 发出 POST 请求,然后只收到 orderId。为了获取订单特定数据并将其显示给用户,我需要向另一个 API 发出另一个请求,该 API 将密钥和 orderID 作为参数,如果找到订单将显示订单特定数据。这必须在单个请求中发生,这意味着在单击按钮时会生成订单并且还会显示订单数据(这是第二个请求)。所以我需要将这两个链接请求在一起。 流程:创建订单 -> 接收 ID(数组) -> 发出第二个请求以接收订单特定数据 -> 向用户显示数据

简化代码示例(删除了正确的错误处理等。这只是一个 axios 示例):

            const axiosHeaders = {
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded'
                }
            };
           
            //APIKEY is just string example "123dsdasd1231eadsa" and array of data is arrayOfData: [ 13798, 13799, 13800 ]
            const URLparams = "key="+ this.apiKey + "&data=" + this.arrayOfData

            axios.post('http://xxxxxxxxxxx/placebulkorder', params, axiosConfig)
            .then((response) => { 

                this.orderids = response.data.data.map(data => data.order_id)
                console.log(response)
            })
            .catch((e) => {
                console.log(error)
            }).finally(() => {
                
                const params = new URLSearchParams()
                params.append('key', this.apiKey)
                params.append('orderid', this.orderids)

                axios.post('http://xxxxxxxxxxx/order-status-bulk', params, axiosConfig
                ).then((response => { console.log(response) }))
                 .catch((error) => { console.log(error) })

            })

问题: 如上所述,为了获取订单特定数据,必须进行第二次请求。该请求以 apiKey 和 orderIds 数组为参数('Content-Type': 'application/x-www-form-urlencoded')

  1. 如果我有静态 orderId: [13798, 13799, 13800] 并在第二个请求 URLparam 中使用它,那么第二个请求返回代码 200,所以一切正常。

    data(){
       return {
           orderId: [13798, 13799, 13800], //hardcoded values for example
           api_key: process.env.MIX_IPHONE_CHECKS_APP_KEY, //API key from .env file
     },
    

  2. 如果我有返回数据 orderId: [] 并且在代码中我会将第一个请求响应 orderIds 映射到 this.orderID //动态数组// 并在代码中使用它,如下所示,然后服务器返回错误 500。(映射在上面的例子中)

     data(){
       return {
           orderids: [], //used to map response orderID dynamically
           api_key: process.env.MIX_IPHONE_CHECKS_APP_KEY, //API key from .env file
     },
    

在 URLparam 中使用静态数组会成功,但使用来自第一个请求响应对象的动态数组会抛出错误代码 500。这很奇怪,因为在第一次请求后,如果我控制台注销 this.orderIds,那么所有正确的响应 orderIDs将显示在 console.log 中,这意味着数组中有项目。同样如上所示,在这两种情况下,请求是相同的,但一个产生错误 500,另一个成功。

我尝试了什么? 我试图不使用 axios.then.catch 并将其手动转换为 async/await 。也不工作。 我曾尝试使用 QS 模块对 urlparams (https://www.npmjs.com/package/qs) 进行字符串化,但也无法正常工作。 我尝试在映射中使用 JSON stringify 方法 this.orderids = response.data.data.map(data => JSON.stringify(data.order_id)) 之后使用 .join() 方法将其转换为数组。 我一直得到相同的结果。静态数组有效,但动态无效。

但是 ....我还尝试了另一件事,产生了一些结果。如果我创建了具有第二个请求含义的单独方法:

  1. 点击按钮创建订单
  2. 将 orderIds 从响应映射到数组
  3. 等待几秒钟,然后单击另一个按钮以获取订单特定数据,然后成功 所以总而言之......在发出第二个请求之前等待工作。对于动态数组,如果我在发出第二个请求之前等待几秒钟(在最终原因中设置超时或在手动触发第二个请求之前等待)它可以工作。 这仅适用于动态数组。不管静态数组有多长。在静态数组的情况下,api 总是以代码 200 成功。

是什么导致了这个问题?为什么动态数组的处理方式不同?这是 axios 特定的东西吗?如何解决?

谢谢。如果需要更多规格,请告诉我。

【问题讨论】:

    标签: laravel vue.js axios


    【解决方案1】:

    您可以尝试使用另一个 .then() 钩子,而不是依赖 finally。 以下是您可以如何解决它并保持当前流程不变的方法。

    const axiosHeaders = {
                    headers: {
                        'Content-Type': 'application/x-www-form-urlencoded'
                    }
                };
               
                //APIKEY is just string example "123dsdasd1231eadsa" and array of data is arrayOfData: [ 13798, 13799, 13800 ]
                const URLparams = "key="+ this.apiKey + "&data=" + this.arrayOfData
    
                axios.post('http://xxxxxxxxxxx/placebulkorder', params, axiosConfig)
                .then((response) => { 
                    return response.data.data.map(data => data.order_id)
                })
                .catch((e) => {
                    console.log(error)
                }).then((ids) => {
                    const params = new URLSearchParams()
                    params.append('key', this.apiKey)
                    params.append('orderid', ids)
    
                    axios.post('http://xxxxxxxxxxx/order-status-bulk', params, axiosConfig
                    ).then((response => { console.log(response) }))
                     .catch((error) => { console.log(error) })
                });
    

    【讨论】:

    • 嗨,谢谢你的建议,但结果是一样的:( 抛出错误 500
    • 您确定第一次调用会返回 orderid 吗?在语法方面,老实说,我认为这两种实现都没有问题。将其重写为 async/await 也不应该产生任何不同的结果。目前听起来你执行了第一次调用,但从未真正映射一个 orderid 数组(可能是一个未定义数组?)所以在你第二次调用时它返回 500 可能是由于你的 api 调用中缺少参数。
    • 嗨,是的。如果我控制台记录 orderid,那么我可以在日志中看到它们。同样如上图所示,请求包含 orderid。 :( 这是一个谜,因为我至少在这个问题上花了 20 个小时,什么也没做:/
    • 你能检查一下你的接收API是否处理了请求吗?问题是否可能来自某种“种族”条件?就像您正在下订单,获取 id,但您调用的其他 API 在您的第二次调用时尚未收到信息,因此您的 orderids 那时还不知道?它可以解释为什么等待会有所帮助以及为什么静态数组可以工作,因为它们可能是您前段时间已经创建的订单的 ID。
    • 谢谢布拉克斯。这让你刚才所说的更有意义。我担心的是返回了 orderID。也许第 3 方系统会返回 ID,但在后端尚未创建订单本身,这就是我收到错误的原因?这也是有道理的,因为如果我为第二个请求设置延迟,那么假设我使用第一个请求创建 100 个订单并等待 5 秒然后发出第二个请求,则会引发错误。但如果我创建 1 个订单并等待 5 秒第二个请求,就成功了。也许理论上是后端还没有完成订单,因此出现错误?
    猜你喜欢
    • 2012-05-09
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 2017-11-08
    • 2014-06-03
    • 2019-06-29
    • 2019-04-03
    • 1970-01-01
    相关资源
    最近更新 更多