怎么获取 nodejs 中 get 请求的返回值呢 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yilai
V2EX    Node.js

怎么获取 nodejs 中 get 请求的返回值呢

  •  
  •   yilai 2018-02-05 00:31:58 +08:00 8948 次点击
    这是一个创建于 2887 天前的主题,其中的信息可能已经有所发展或是发生改变。

    js 新手提问...

    逻辑是这样的,我通过 GET 请求一个 api,api 返回 token, 然后我需要把这个封装成一个方法,当 token 存在且没有过期时,直接返回 token,当 token 过期,重新请求 api 获取,然后写入缓存并返回,(暂时先只考虑请求 api 的问题,缓存还没想)在我需要 token 的时候调用这个方法,得到 token,可是这是个异步方法,我直接 let 肯定是获取不到这个值的,请问我应该怎么做? 上图 image

    29 条回复    2020-02-11 16:01:10 +08:00
    throns
        1
    throns  
       2018-02-05 01:08:29 +08:00 via iPhone
    方法很多呀,回调函数也可以,不过看到你用 ES6 了,去看看 async/await 吧
    throns
        2
    throns  
       2018-02-05 01:13:42 +08:00 via iPhone
    尴尬了,async/await 是 es7 的,不过这个问题你搜一下就有超多的答案,不需要在这里问。
    laxenade
        3
    laxenade  
       2018-02-05 01:15:14 +08:00 via Android
    Async 是正解 但 async 是 es8 的
    throns
        4
    throns  
       2018-02-05 01:18:49 +08:00 via iPhone
    @laxenade 又尴尬 你说的对,是 ES2017 也就是 ES8
    lcorange
        5
    < href="/member/lcorange" class="dark">lcorange  
       2018-02-05 01:37:33 +08:00
    巧了,刚好我这两天写了这段,发你看看,以后多去搜搜吧
    ```
    const request = require('request-promise');
    exports.getAccessToken = async function () {
    const uri = `${rootUrl}/token?grant_type=client_credential&appid=${appID}&secret=${appSecret}`;
    return await request.get({
    uri,
    json: true,
    });
    };
    ```
    WittBulter
        6
    WittBulter  
       2018-02-05 01:37:40 +08:00
    @throns。。。。。。你也太谐了
    Enivel
        7
    Enivel  
       2018-02-05 01:42:37 +08:00 via iPhone   1
    @throns 影射我大 js 版本混乱。block 了
    yilai
        8
    yilai  
    OP
       2018-02-05 01:51:55 +08:00 via Android
    @throns async 不太理解,但是我发现只要我想用 await 的话,外层函数必须是 async。。那到最后岂不是每一个需要过去 accesstoken 的方法都需要是 async
    yilai
        9
    yilai  
    OP
       2018-02-05 01:52:15 +08:00 via Android
    @lcorange 好的,我看看
    lcorange
        10
    lcorange  
       2018-02-05 01:53:48 +08:00
    @yilai 我用的 koa 框架,支持 async 函数,所以从请求入口一直到数据库已经微信交互,基本所有函数都是 async 的
    sneezry
        11
    sneezry  
       2018-02-05 01:56:37 +08:00 via iPhone
    哎,这是一坨 async await promise 的巨坑…
    LancerComet
        12
    LancerComet  
       2018-02-05 01:56:55 +08:00
    ```Javascript
    function getToken () {
    new Promise((resolve, reject) => {
    request.get('...', (error, res, body) => {
    if (error) {
    return reject({
    data: null,
    error
    })
    }

    const token = ...
    resolve({
    data: token,
    error: null
    })
    })
    })
    }

    async function main () {
    const { data: token, error } = await getToken()
    if (error) {
    // Nothing but error.
    } else {
    // Now you have it.
    console.log('Token:', token)
    }
    }
    ```
    yilai
        13
    yilai  
    OP
       2018-02-05 01:59:50 +08:00 via Android
    @sneezry 感觉好难
    yilai
        14
    yilai  
    OP
       2018-02-05 02:02:47 +08:00 via Android
    另外问一个问题,各位对于钉钉微应用开发怎么看....公司领导让我年后做类似于通知一类的东西,看钉钉文档没太看明白,不知道到底能做什么,有做过或者研究过的大佬说下心得的吗
    yilai
        15
    yilai  
    OP
       2018-02-05 02:04:58 +08:00 via Android
    每一个需要过去 accesstoken 的方法都要写上 async 吗。。
    sneezry
        16
    sneezry  
       2018-02-05 02:27:25 +08:00 via iPhone
    @yilai 感觉难是正常的,非常正常…
    negativeInfinity
        17
    negativeInfinity  
       2018-02-05 03:06:44 +08:00
    const rp = require('request-promise');

    const getToken = () => {
    return getMySavedToken().then((token) => { // Assume your getMySavedToken API returns a Promise.
    if (token && hasExpired(token)) { // If token hasn't expired.
    return token;
    }
    return rp.get('Get a new token here').then((body) => {
    return JSON.parse(body).access_token;
    });
    });
    };

    getToken().then((token) => {
    // use my token
    }).catch((err) => {
    // Oops, something's wrong!
    });
    negativeInfinity
        18
    negativeInfinity  
       2018-02-05 03:09:53 +08:00
    不支持缩进?哪里能看到输入框支持什么样的格式呢?
    ```
    let test = 'test';
    ```

    ```Javascript
    let testAgain = 'test';
    ```
    hlwjia
        19
    hlwjia  
    PRO
       2018-02-05 06:01:10 +08:00 via iPhone
    正确的贴代码方式是 gist
    hlwjia
        20
    hlwjia  
    PRO
       2018-02-05 06:03:55 +08:00 via iPhone
    似乎你完全把 工作分摊给 V2EX 了
    yilai
        21
    yilai  
    OP
       2018-02-05 08:50:19 +08:00 via Android
    @hlwjia 一个过去 accesstoken 就叫完全吗。。。。讨论一下,觉得钉钉的文档写的。。。。
    yilai
        22
    yilai  
    OP
       2018-02-05 09:00:23 +08:00 via Android
    @sneezry 为什么我觉得所谓的终极解决方案 async/await 也非常的坑
    codermagefox
        23
    codermagefox  
       2018-02-05 10:28:52 +08:00
    @throns #4 花样黑前端,block 了
    sneezry
        24
    sneezry  
       2018-02-05 12:46:26 +08:00
    @yilai #22 async await 调用起来很舒服,但是构造起来很恶心,属于一劳永逸的方案
    momoxiaoqing
        25
    momoxiaoqing  
       2018-02-05 13:34:35 +08:00
    建议搜索下 axios
    laxenade
        26
    laxenade  
       2018-02-05 16:08:55 +08:00 via Android
    @yilai 对哒,全部都要是 async,但用起来很爽呢
    yilai
        27
    yilai  
    OP
       2018-02-05 17:21:23 +08:00
    @laxenade 好哒,确定全都 async 没问题就行....
    wisetc
        28
    wisetc  
       2018-02-09 12:02:14 +08:00
    可以用 co 和 generators
    pingba
        29
    pingba  
       2020-02-11 16:01:10 +08:00
    @throns @lcorange @yilai @LancerComet @negativeInfinity

    快帮我也看看,我的需求是做中转数据,就是再我 get 方面里 get 访问 URL,获取数据,再返回去。
    t/643749
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2425 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 08:33 PVG 16:33 LAX 00:33 JFK 03:33
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86