V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
unt
V2EX  ›  Node.js

node 写简单接口发现一件诡异的事,求解答

  •  1
     
  •   unt · 223 天前 · 2964 次点击
    这是一个创建于 223 天前的主题,其中的信息可能已经有所发展或是发生改变。


    用 node 写了一个接口,这个接口里会调用很多现成的 api 接口,然后将这些接口返回的数据重新组合规整一并返回。

    测试过程中发现 A 接口返回的数据居然和直接调用 A 接口不一样。。

    A 接口写在 app.get 里返回:
    {data:[{bit:'35'}],code:0}

    直接调用 A 接口返回:
    {data:[{bit:'0'}],code:0}


    这究竟是为什么。。。
    24 条回复    2023-09-19 14:40:59 +08:00
    cherryas
        1
    cherryas  
       223 天前
    建议不用想歪了,显然是发出的请求不一样。(仅代表我个人观点)
    dream4ever
        2
    dream4ever  
       223 天前
    一切的诡异最后都会有真实的原因在背后,就你这个情况而言,后端数据有没有可能是其他人修改了?或者是哪里的代码写错了?计算机不会出现灵异事件,绝大部分都是人的原因。
    caiqichang
        3
    caiqichang  
       223 天前
    抓包对比一下请求头
    NessajCN
        4
    NessajCN  
       223 天前
    没看懂啥叫「直接调用 A 接口」
    建议你把两种方式的具体操作方法或代码 po 上来
    juzisang
        5
    juzisang  
       223 天前
    nodejs 不至于这么点东西都能搞错,建议好好排查下其它问题...
    dreasky
        6
    dreasky  
       223 天前
    你的 res 能不要写和外面一样的吗
    aikilan
        7
    aikilan  
       223 天前
    这种情况跟 NODE 没啥关系,直接看看两次请求的 body 有啥区别,如果是内部的接口聚合,不如直接找对于的开发问问有什么需要注意的,或者直接让对方给你断点也许啊
    pota
        8
    pota  
       223 天前
    先确定请求头和请求内容一致吧。肯定是有不一样的地方
    winnerczwx
        9
    winnerczwx  
       223 天前
    最诡异的地方不应该是你两次请求参数不同得到了不同的返回值, 而你却觉得这很诡异还发了一贴...?
    Belmode
        10
    Belmode  
       223 天前
    这个接口里,两个 fetch 方法都是异步的,当这个路由的 Handler 方法返回,fetch A 或者 fetch B 总有一个先调用了 resovle ,第二个还没有调用完成,express 直接把 response 直接响应了。

    显然,你这个路由 handler 里最先处理的是 第二个 fetch 方法,获取的 B 数据
    Belmode
        11
    Belmode  
       223 天前
    解决办法,用 Promise.all 包裹,或者把两个 fetch 用 then 串联起来。
    TabGre
        12
    TabGre  
       223 天前 via iPhone
    总想搞个大新闻
    jaylee4869
        13
    jaylee4869  
       223 天前 via iPhone   ❤️ 1
    基于你的写法我感觉你对 Node.js 不是很熟悉。
    常量最好用 const 申明,现在 commonjs 已经逐渐推出历史舞台,所以还是尽快迁到 ESM ,另外请使用 async/await 来处理 Promise 吧,起码可以直观看出代码的执行顺序……
    shuimugan
        14
    shuimugan  
       223 天前 via Android
    基础不牢看什么都是魔法,上抓包数据
    royalknight
        15
    royalknight  
       223 天前
    应该是接口的问题,发出来让大伙压力测试下
    unt
        16
    unt  
    OP
       223 天前
    @royalknight #15 我初步查下来是接口并发有问题。没心气神了,不管了,自己不测试的后端是真菜啊
    M003
        17
    M003  
       223 天前
    如果参数一样. 你先确认出来 打印出来是 A,还是 B 的. 建议你在 log 中写死 'A'/'B'
    ====
    你 A,B 是并发请求; 并不是单步请求,处理完 A,再请求 B.

    要不就并发 用 `Promise.all` 要不用 await 单步查看一下,每一步返回什么信息.
    unt
        18
    unt  
    OP
       223 天前
    @M003 #17 这些肯定都知道的呀,所以才说诡异。。这两个请求压根就没请求参数,所以上面说请求参数的我全都忽略了。 是压力并发问题,这接口不是查数据库,所以比较特殊
    amlee
        19
    amlee  
       223 天前
    哈哈,node 里面的东西默认都是异步非阻塞,随便搞个啥东西并发就出来了。

    估计你们后端水,后端自己调一下接口,没问题就放那了,压根没考虑并发的事
    M003
        20
    M003  
       223 天前
    @unt 排除参数问题, 可能是执行顺序问题. 你可以在最后 console.log 中,打印出接口地址. 你的代码是并行执行了 A 和 B, 如果 B 先执行完,会先打印出来, 现在要看看是 B 先执行完,还是 A 先执行完.

    ====

    如果 B 先执行完,先返回数据,并打印出来. 也不是问题. 因为就是这么设计的. 你可以用 async/await 来处理执行顺序.
    mark2025
        21
    mark2025  
       223 天前
    接口实现没控制好(并发下的)状态(session, token 等等)吧
    jiangzm
        22
    jiangzm  
       223 天前
    你应该把抓包的原始请求对比下, 另外 A 接口也要贴出来。 不然让大家陪你猜谜语呢???
    grit136907108
        23
    grit136907108  
       222 天前
    你这所有的响应都用 res 表示,你确定没问题?
    webszy
        24
    webszy  
       222 天前 via Android
    建议重学一下 JS 里的 promise ,你那样写能对吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1106 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:50 · PVG 06:50 · LAX 15:50 · JFK 18:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.