nodejs的转发接口遇到的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nodejs的转发接口遇到的问题相关的知识,希望对你有一定的参考价值。

参考技术A 之前在预生产环境遇到过这个问题,h5页面和API部署在不同域名下,访问接口返回值为乱码。

当时的解决办法为放在同一域名下,但是并没有解决根本问题。

现在生产环境公司要求绝对不能放在同一域名下,(一个小伙伴给的解释是抢占资源,我觉得合理)

所以当下问题就来了,搞了两天才弄明白真正原因。

第一,乱码问题

是因为nginx为了节省资源在返回html的时候会自动压缩(不知道记得对不对)

在请求的时候加上 gzip:true 即可。

第二,nginx返回404问题

乱码问题解决了以后,发现nginx返回的结果为404。

原因是headers

是因为此处传给API的headers直接复用了页面给nodejs的headers(req.headers为页面给nodejs的headers)req.headers有个参数为host指向的是h5页面的地址而不是API的地址

(猜测,加上host后nginx会根据host来找调用的API地址,因为不在同一域名下,此时host指向的是页面部署的域名而不是API部署的域名,自然找不到,这也就解释了为什么部署在同一域名时不会出现问题。

本地运行的时候,访问IP地址可以正常返回结果,访问IP对应的域名时404,是因为访问IP时不会通过nginx,所以也不会有问题)

使用Nodejs获取博客园博客数据并处理转发

通过查询了解到博客园是有开发博客查询相关的接口的,列表如下:

 

UriMethodDescription
48HoursTopViewPosts/{itemCount} GET 48小时阅读排行
bloggers/recommend/{pageIndex}/{pageSize} GET 分页获取推荐博客列表
bloggers/recommend/count GET 获取推荐博客总数
bloggers/search GET 根据作者名搜索博主
post/{postId}/comments/{pageIndex}/{pageSize} GET 获取文章评论
post/body/{postId} GET 获取文章内容
sitehome/paged/{pageIndex}/{pageSize} GET 分页获取首页文章列表
sitehome/recent/{itemcount} GET 获取首页文章列表
TenDaysTopDiggPosts/{itemCount} GET 10天内推荐排行
u/{blogapp}/posts/{pageIndex}/{pageSize} GET 分页获取个人博客文章列表

 

但是我们打开其中一个接口的话会发现提供的接口返回的是xml格式的内容,因此如果需要后台转发为前台需要的格式还需要把xml转换为json数据:

 

那么我们一步一步来,首先需要Node将这个接口代理转发为自己的接口,其实只需要express的request中间件就可以了:

router.get(\'/api/getCNBlog\', (req, res) => {
    let url = \'http://wcf.open.cnblogs.com/blog/TenDaysTopDiggPosts/6\';
    let data = {}
    request(url, (error, response, body) => {
            res.send(body)
    })
})

  但是这个时候接口返回的仍是xml格式的数据。那么下一步,我们需要将xml进行转化,通过搜索了解到node是有xml2js这个插件的,因此只需要在我们的node文件里面引入,再将数据转化就可以了。更改后的简易代码如下:

const xml2js = require(\'xml2js\');

const parseString = xml2js.parseString;

router.get(\'/api/getCNBlog\', (req, res) => {
    let url = \'http://wcf.open.cnblogs.com/blog/TenDaysTopDiggPosts/6\';
    let data = {}
    request(url, (error, response, body) => {
        parseString(body, (err, result) => {
            res.send({
                code: 200,
                data: result
            })
        });
    })
})

  如此一来,就可以看到,后台发过来的数据已经转为了Json格式:

大功告成~

 

 

 

以上是关于nodejs的转发接口遇到的问题的主要内容,如果未能解决你的问题,请参考以下文章

nodejs调用webservice接口返回500是啥原因

H3C SDN运维遇到的问题

nodejs 代理 解决开发环境跨域问题

H5拖放+FormData接口+NodeJS,完整异步文件上传

springcloud 通过gateway路由转发调用接口很慢问题

nodejs博客遇到的问题