V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
pingba
V2EX  ›  问与答

关于一个 node.js 的问题,需求是这样,将聚合平台的 API 返回的数据,通过自己的接口包一层,返回聚合平台的数据。我在网上查了些资料,但是并没有成功,所以请教一下技术大大们,求段代码。

  •  
  •   pingba · 2020-02-11 15:28:24 +08:00 · 1312 次点击
    这是一个创建于 1754 天前的主题,其中的信息可能已经有所发展或是发生改变。
    具体需要

    1.访问我的接口
    2.我的接口访问聚合接口,接受返回来的数据。
    3.数据一点都不改的返回


    app.get('/api/abc',function(req,res){
    console.log("API 請求");


    http.get('http://v.juhe.cn/toutiao/index"', function (res) {
    //console.log("statusCode: ", res.statusCode);
    //console.log("headers: ", res.headers);
    var json = '';
    res.on('data', function (d) {
    json += d;
    });
    res.on('end',function(){
    //获取到的数据
    json = JSON.parse(json);
    res.send(json);

    });
    }).on('error', function (e) {
    res.send(e);

    });



    })


    这是我查询其他资料获取的代码片段,但是并没有达到预期的效果。本人对 node.js 还是小白,请求大大们修改一下。
    11 条回复    2020-02-11 17:23:41 +08:00
    pingba
        1
    pingba  
    OP
       2020-02-11 16:01:54 +08:00
    没人,雷锋一把吗?我顶!
    hyyou2010
        2
    hyyou2010  
       2020-02-11 16:10:59 +08:00
    首先,res.send(json) 是内层 http.get 的 res,或应该是外层 app.get 的 res ?
    pingba
        3
    pingba  
    OP
       2020-02-11 16:13:49 +08:00
    @hyyou2010 外层的,我只是想把内层的 get 请求的数据返回去。

    就是访问 ***/api/abc 这个的时候,获取 http://v.juhe.cn/toutiao/index 的数据
    pingba
        4
    pingba  
    OP
       2020-02-11 16:19:03 +08:00
    @hyyou2010 如何修改,能否直接贴代码,我太小白了。
    hyyou2010
        5
    hyyou2010  
       2020-02-11 16:24:40 +08:00
    你把外层的 res 全部修改为 outerRes 试试看

    app.get('/api/abc', function (req, outerRes) {
    console.log("API 請求");


    http.get('http://v.juhe.cn/toutiao/index"', function (res) {
    //console.log("statusCode: ", res.statusCode);
    //console.log("headers: ", res.headers);
    var json = '';
    res.on('data', function (d) {
    json += d;
    });
    res.on('end', function () {
    //获取到的数据
    json = JSON.parse(json);
    outerRes.send(json);

    });
    }).on('error', function (e) {
    outerRes.send(e);

    });



    })
    hyyou2010
        6
    hyyou2010  
       2020-02-11 16:27:07 +08:00   ❤️ 1
    另外建议在两个 res.on 里面都加打印,看看真的获取到 toutiao 的数据没有
    pingba
        7
    pingba  
    OP
       2020-02-11 16:33:46 +08:00
    @hyyou2010 代码是网上搜的,node 我太业余了,连个调试环境都没有,直接部署宝塔面板做的接口。这段代码估计就有问题。能帮忙跑一下吗?感谢 /
    hyyou2010
        8
    hyyou2010  
       2020-02-11 17:05:03 +08:00
    首先,改 outerRes 那一步应该是没问题。

    其次,你应该用浏览器先访问一下 juhe.cn 那个网址

    访问结果返回:
    resultcode "101"
    reason "错误的请求 KEY"
    result null
    error_code 10001

    说明你请求时需要一个 key,那么代码中还需要增加这个 key
    hyyou2010
        9
    hyyou2010  
       2020-02-11 17:07:35 +08:00
    toutiao/index -------- 就是说这个网址需要一个访问 key
    pingba
        10
    pingba  
    OP
       2020-02-11 17:11:55 +08:00
    @hyyou2010 可能是宝塔不兼容把,不过我用另一段代码成功解决了问题。

    const http =require('http');

    http.get('http://v.juhe.cn/toutiao/index', (res) => {

    const { statusCode } = res;

    const contentType = res.headers['content-type'];

    let error;
    if (statusCode !== 200) {
    error = new Error('请求失败\n' +
    `状态码: ${statusCode}`);
    } else if (!/^application\/json/.test(contentType)) {

    error = new Error('无效的 content-type.\n' +//再次报错
    `期望的是 application/json 但接收到的是 ${contentType}`);
    }
    if (error) {
    outerRes.send(error.message);

    res.resume();
    return;
    }

    //请求成功
    res.setEncoding('utf8');
    let rawData = '';
    res.on('data', (chunk) => { rawData += chunk; });
    res.on('end', () => {

    try {


    outerRes.send(rawData);

    } catch (e) {

    outerRes.send(e.message);

    }
    });
    }).on('error', (e) => {

    outerRes.send(e.message);

    });


    换成这个就可以中转数据了。
    hyyou2010
        11
    hyyou2010  
       2020-02-11 17:23:41 +08:00
    嗯嗯,解决了就好
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2493 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 02:15 · PVG 10:15 · LAX 18:15 · JFK 21:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.