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

node.js 怎么做服务器端来请求第三方 api

  •  
  •   BaiLinfeng · 2020-06-19 09:17:06 +08:00 · 7241 次点击
    这是一个创建于 1623 天前的主题,其中的信息可能已经有所发展或是发生改变。
    node.js 怎么做服务器端来请求第三方 api,在让前端直接请求服务器拿数据
    40 条回复    2020-06-24 22:18:54 +08:00
    saozhu
        1
    saozhu  
       2020-06-19 09:21:25 +08:00   ❤️ 1
    你的标题原封不动就能搜出一堆教程
    wenzichel
        2
    wenzichel  
       2020-06-19 09:22:24 +08:00
    1. 用 express 或者 koa 起一个服务器;
    2. 用 axios 请求第三方接口的数据;
    3. 返回到前端;

    req.pipe(api).pipe(res);
    BaiLinfeng
        3
    BaiLinfeng  
    OP
       2020-06-19 09:24:47 +08:00
    @saozhu 我搜了,没有太多的理解 node,有点吃不消
    BaiLinfeng
        4
    BaiLinfeng  
    OP
       2020-06-19 09:27:21 +08:00
    @wenzichel express 我使用的,找流量很多教程看不进去,没有一个类似的 demo,都是基础使用 api 方法,我想做的是服务器端带 token 和请求头,然后让前端在来请求服务器、。
    zhuweiyou
        5
    zhuweiyou  
       2020-06-19 09:27:55 +08:00
    起个 express / koa 之类的服务,用 axios / request / superagent 之类的库 去请求
    sedgwickz
        6
    sedgwickz  
       2020-06-19 09:30:02 +08:00
    [3rd api/scraper] --> your server --> [save cache/database] --> your api --> your client

    这个和 node 貌似没太多关系,任何能做服务端的语言都可以这么搞
    BaiLinfeng
        7
    BaiLinfeng  
    OP
       2020-06-19 09:33:21 +08:00
    @zhuweiyou 目前我使用的 express 前端请求用的是 axios,只把服务器启动成功了,就无从下手了,看了 node 和 express 官网都是一些 api 的使用,没有找到相关需求的 demo 。
    BaiLinfeng
        8
    BaiLinfeng  
    OP
       2020-06-19 09:34:14 +08:00
    @sedgwickz 目前我使用的 express 前端请求用的是 axios,只把服务器启动成功了,就无从下手了,看了 node 和 express 官网都是一些 api 的使用,没有找到相关需求的 demo 。你说的这个是什么黑科技完全看不懂
    galikeoy
        9
    galikeoy  
       2020-06-19 09:37:05 +08:00
    @BaiLinfeng #8 还黑科技。。。很常见的流程
    zhuweiyou
        10
    zhuweiyou  
       2020-06-19 09:37:13 +08:00
    @BaiLinfeng 服务器请求第三方,也可以用 axios
    BaiLinfeng
        11
    BaiLinfeng  
    OP
       2020-06-19 09:40:12 +08:00
    @galikeoy 表示看不懂,还是看中文直接,是我太菜了
    zhw2590582
        12
    zhw2590582  
       2020-06-19 09:42:12 +08:00
    菜的话,那就从基础学起,别一下子深入
    BaiLinfeng
        13
    BaiLinfeng  
    OP
       2020-06-19 09:43:02 +08:00
    @zhuweiyou 我现在服务器端一点思路都没有,启动服务成功后就放了一个 app.get("/"(req,res)=>{ses.send("响应给前端的内容")})
    BaiLinfeng
        14
    BaiLinfeng  
    OP
       2020-06-19 09:44:15 +08:00
    @zhw2590582 主要是自己的需求很清楚,后端实现起来就棘手,都是临时的用 node.js
    rockjike
        15
    rockjike  
       2020-06-19 09:47:26 +08:00
    app.get("/" async (req,res)=>{const data = await axios.get(/url )res.send("响应给前端的内容" + data)}
    easonHHH
        16
    easonHHH  
       2020-06-19 09:49:38 +08:00
    const axios = require('axios');

    ......

    app.get("/",async (req,res)=>{
    const result = await axios.get((具体内容看 axios 文档))
    ses.send("响应给前端的内容")
    })

    把 result 筛选一下放到 send()里面不就好了吗
    TomatoYuyuko
        17
    TomatoYuyuko  
       2020-06-19 09:49:51 +08:00
    脚手架搭起来 express,安装 axios,express 里写个对应的路由给前端调用,在路由回调里请求第三方,处理第三放返回,再返回给前端
    BaiLinfeng
        18
    BaiLinfeng  
    OP
       2020-06-19 09:51:09 +08:00
    @rockjike 那还需要些路由吗?有很多不一样的路径地址
    bi531334444
        19
    bi531334444  
       2020-06-19 09:51:13 +08:00   ❤️ 1
    那建议你用 eggjs 跟着文档一步步来就完了
    BaiLinfeng
        20
    BaiLinfeng  
    OP
       2020-06-19 09:52:52 +08:00
    @easonHHH 需要用到路由吗?有不同的路径地址,我直接把地址传参进来应该用什么办法
    ChanKc
        21
    ChanKc  
       2020-06-19 09:54:55 +08:00 via Android
    哈哈,你的标题就错了
    你要找的是一个在 node 环境下的客户端库,而不是服务端
    axios 就是这样的客户端
    BaiLinfeng
        22
    BaiLinfeng  
    OP
       2020-06-19 09:56:03 +08:00
    @ChanKc 标题没有错哦,我要的就算在服务器搭建接口来请求第三方 api
    maplelin
        23
    maplelin  
       2020-06-19 09:56:33 +08:00
    @BaiLinfeng #20 楼主没写过后端吗,这些都是后端技能的基础,如果都没有接触过的话,那你估计得一段时间去学了,建议对着文档一点点撸
    BaiLinfeng
        24
    BaiLinfeng  
    OP
       2020-06-19 09:57:53 +08:00
    @maplelin 后端没学过,还是看在 node 是基于 js 才选择的 node 来研究
    npm
        25
    npm  
       2020-06-19 09:58:54 +08:00
    感觉你要不用 egg.js 吧?

    express 很多都得要自己封装,而 egg.js 很多已经帮你封装好了,并且中英文文档都很详细。

    YouTube 和 B 站上也有 egg.js 的教程
    BaiLinfeng
        26
    BaiLinfeng  
    OP
       2020-06-19 10:01:54 +08:00
    @npm 我选择的是 node+express+axios,主要是自己来使用的接口,所以才自己来搭建的。
    youxiachai
        27
    youxiachai  
       2020-06-19 10:02:30 +08:00
    ls 说了这么多...lz 没听懂..我说一个比较野的路子....
    用 node 调 curl...
    curl 或者 wget 总会用了吧...
    BaiLinfeng
        28
    BaiLinfeng  
    OP
       2020-06-19 10:04:06 +08:00
    @youxiachai 我正在用楼上的铁汁们说的办法,实际上是直接把他们的代码扣下来 const axios = require('axios');

    ......

    app.get("/",async (req,res)=>{
    const result = await axios.get((具体内容看 axios 文档))
    ses.send("响应给前端的内容")
    })
    ,我有不同的路径需要单独写路由吗?
    npm
        29
    npm  
       2020-06-19 10:07:07 +08:00
    @BaiLinfeng 嗯,实现了就好
    youxiachai
        30
    youxiachai  
       2020-06-19 10:09:15 +08:00
    @BaiLinfeng 这个应该是个工具方法,,你的不同路径调用一下这个方法就好了....
    96412hj
        31
    96412hj  
       2020-06-19 10:09:17 +08:00
    你说的是转发吧,任何一个服务器语言都可以转发的呢,你 google,nodejs 转发接口 demo,一大堆
    guanhui07
        32
    guanhui07  
       2020-06-19 10:11:57 +08:00
    用 koa2 request 包
    libook
        33
    libook  
       2020-06-19 10:22:44 +08:00
    直接使用 Node API 来发起请求:
    HTTP: https://nodejs.org/dist/latest-v14.x/docs/api/http.html#http_http_request_options_callback
    HTTPS: https://nodejs.org/dist/latest-v14.x/docs/api/https.html#https_https_request_options_callback
    入参和出参是什么 Class 的对象就看对应 Class 的文档。另外 Node 异步非阻塞以及 Callback 机制得懂。

    广泛使用的第三方请求库 Axios:
    https://github.com/axios/axios
    得懂得 JS 的 Promise 、async/await 。

    JS 基础不行的话看 MDN: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide
    Node 基础不行的话看 Guide,花不了多长时间: https://nodejs.org/en/docs/guides/

    作为程序员英语得过关。

    你可以在学会走之前先学会跑,但是总得先学会如何动腿; Node 虽然上手很简单,但是基本的特性还是得学的,API 文档还是得浏览一下的。

    不积跬步,无以至千里。
    easonHHH
        34
    easonHHH  
       2020-06-19 10:26:23 +08:00
    用不同的接口你想办法把配置传到后端呗,方法多了去了,通过路由,GET 参数,POST 内容都行啊
    1 、根据路径区分就用 app.use('/a/b')这里面配置,支持正则表达和:xx 等匹配方法
    // GET /file/javascripts/jquery.js
    console.dir(req.params[0])
    // => 'javascripts/jquery.js'
    2 、GET 参数方法:
    // GET /search?q=tobi+ferret
    console.dir(req.query.q)
    // => 'tobi ferret'
    3 、还可以用 POST 方法
    app.use(express.json()) // for parsing application/json
    app.use(express.urlencoded({ extended: true })) // for parsing application/x-www-form-urlencoded

    app.post('/profile', function (req, res, next) {
    console.log(req.body)
    res.json(req.body)
    })
    这些都是文档里面写得清清楚楚的,你看一下文档里面 request(req)的属性吧
    https://expressjs.com/zh-cn/4x/api.html#req.body
    yinjunjian0
        35
    yinjunjian0  
       2020-06-19 11:08:05 +08:00
    我寻思看请求库的文档不是更快更好理解吗
    Yourshell
        36
    Yourshell  
       2020-06-19 12:27:00 +08:00
    这不是反代吗
    ChanKc
        37
    ChanKc  
       2020-06-19 12:45:09 +08:00 via Android
    @BaiLinfeng 请求别人就是客户端
    JackHuang90
        38
    JackHuang90  
       2020-06-19 16:53:23 +08:00
    axios 或者 自己封装 fetch,fetch 我觉得更自由。
    zhengdai1990
        39
    zhengdai1990  
       2020-06-19 22:31:46 +08:00
    直接 pipe
    BaiLinfeng
        40
    BaiLinfeng  
    OP
       2020-06-24 22:18:54 +08:00
    当时想回复的消息,和需求实现的想法太多了,但是 V2EX 禁止发言太快
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4489 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 05:34 · PVG 13:34 · LAX 21:34 · JFK 00:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.