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

2020-02-11 15:28:24 +08:00
 pingba
具体需要

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 还是小白,请求大大们修改一下。
1330 次点击
所在节点    问与答
11 条回复
pingba
2020-02-11 16:01:54 +08:00
没人,雷锋一把吗?我顶!
hyyou2010
2020-02-11 16:10:59 +08:00
首先,res.send(json) 是内层 http.get 的 res,或应该是外层 app.get 的 res ?
pingba
2020-02-11 16:13:49 +08:00
@hyyou2010 外层的,我只是想把内层的 get 请求的数据返回去。

就是访问 ***/api/abc 这个的时候,获取 http://v.juhe.cn/toutiao/index 的数据
pingba
2020-02-11 16:19:03 +08:00
@hyyou2010 如何修改,能否直接贴代码,我太小白了。
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
2020-02-11 16:27:07 +08:00
另外建议在两个 res.on 里面都加打印,看看真的获取到 toutiao 的数据没有
pingba
2020-02-11 16:33:46 +08:00
@hyyou2010 代码是网上搜的,node 我太业余了,连个调试环境都没有,直接部署宝塔面板做的接口。这段代码估计就有问题。能帮忙跑一下吗?感谢 /
hyyou2010
2020-02-11 17:05:03 +08:00
首先,改 outerRes 那一步应该是没问题。

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

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

说明你请求时需要一个 key,那么代码中还需要增加这个 key
hyyou2010
2020-02-11 17:07:35 +08:00
toutiao/index -------- 就是说这个网址需要一个访问 key
pingba
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
2020-02-11 17:23:41 +08:00
嗯嗯,解决了就好

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/643749

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX