Angular with hapi js server jsonp

Angular with hapi js server jsonp

本文关键字:server jsonp js hapi with Angular      更新时间:2023-09-26

我在/api/profile定义了一个端点,它接受post参数。

var http = require('http');
var serverConfig = require('../server.config.js');
var request = require('request');

module.exports = function(server){
  server.route({
      method: 'POST',
      path: '/api/profile',
      handler: getProfileData
  });

    function getProfileData(request, reply){
        var battleTag = request.payload.battleTag;
        getProfileDataHttp(battleTag, function(err, data){
            if(err){
                reply(new Error(err));
            }
            reply(data);
        });
    }
    function getProfileDataHttp(battleTag, callback){
        var key = serverConfig.battleNet.apiKey;
        var tag =  encodeURIComponent(battleTag);
        var url = 'https://eu.api.battle.net/d3/profile/'+ tag + '/?locale=en_GB&callback=JSON_CALLBACK&apikey=' + key;
        console.log(url);
        request(url,function(error, response, body){
            if(error){
                callback(err);
            }
            if(!error && response.statusCode ==200){
                callback(null, body);
            }
        });
    }
};

它正在调用api与json回调,当我收到的数据是在格式:

JSON_CALLBACK({ json data here})

我如何才能让这个端点返回json数据,我已经尝试过JSON.parse(),但它会导致服务器错误。

调用该端点的angular服务如下所示:

 function getProfileData(battleTag){
            var defer = $q.defer();
            var tag = validTag(battleTag);
            if(!tag){
                defer.reject('Invalid Tag please use format 1[a-z]11[a-z0-9]#4[0-9]');  
                return defer.promise;             
            }
            $http.post('/api/profile', {
                    battleTag: battleTag
                })
               .success(function(data){
                    if(data.reason){
                        defer.resolve(data.reason);
                    }
                    defer.resolve(data);               
                })
                .error(function(err){
                    defer.reject(err);
                });
            return defer.promise;
        }

调用将在使用$http时工作。但是我需要创建服务器来隐藏客户端的秘钥

你的问题有点令人困惑。你正在谈论JSONP,但你想直接获取数据。

JSONP的全部意义在于返回封装在您选择的函数中的数据。然后你只需要执行它。

如果你想以直接的方式获取数据,不要使用JSONP。打个"正常"电话就行了。

在快速查看战网API之后,似乎要直接获取数据,您应该简单地忽略请求URL中的'callback'参数。

因此,您的请求URL看起来像这样:
var url = 'https://eu.api.battle.net/d3/profile/'+ tag + '/?locale=en_GB&apikey=' + key;