Azure移动服务invokeApi无法使用cordova项目

时间:2014-12-30 01:31:33

标签: javascript cordova azure-mobile-services

我在VisualStudio JS-Apache Cordova项目中使用Azure移动服务(AzMS),我调用AzMS的自定义API将用户数据插入存储中。我之前在VS网络应用程序javascript中使用的这个代码非常相同,并且它工作正常。 然而,在cordova项目中,我得到了一个意外的连接失败"调用invokeApi时出错。当我从VS网络应用程序尝试时,它工作正常,这意味着自定义API服务代码是好的。

这是我的js客户端代码:

  azmsClient.login(oAuthProvider).done(function (results) {
       console.log("You are now logged in as: " + results.userId);
       var theUserAuthId = results.userId;

        azmsClient.invokeApi('Users/insert', {
               method: 'POST',
                body: { userAuthId: theUserAuthId }
         }).done(function (response) {
                //.... success code
            }, 
            function (error) {
                console.log("Error: " + err.request.responseText);
                //.... error handling
            }); 

  }, 
  function (err) {
    console.log("Error: " + err.request.responseText);
    //.... error handling
  });

在控制台日志中,第一个日志("您现在登录为:" ..)被记录,之后出现错误 - 意外连接失败。
我的天蓝色定制Api代码 -

var logger = require('../api/logUtils.js').logger;

exports.register = function(api){
  api.post('insert', insertUser);
};

/******************************************************************
* @param request
* @param response
*******************************************************************/
function insertUser(request, response){
  var user = request.user;
  var iM = "api.User.insertUser-";
  logger.info( iM + ' called: - ' , request, response, user);
  // Data validation
  if ( user.level === 'anonymous' ) {
    logger.error( iM + 'Anonymous User' );
    response.send(500, { error: "Anonymous user." });
  }

  user.getIdentities({
    success: function (identities) {
        var req = require('request');

        var userId = user.userId.split(':')[1];
        var theProvdr = user.userId.split(':')[0];
        var reqParams;

        logger.info(iM + ': calling getOAuthUserDetails for Identities: - ' , identities);
        try {
            reqParams = getOAuthUserDetails(userId, identities);
        }
        catch(err){
            logger.error(iM + ': getOAuthUserDetails  - ' , err);
            response.send(500, { error: err.message });
            return;
        }

        req.get(reqParams, function (err, resp, body) {
                if (err) {
                    logger.error(iM + ': Error calling provider: ', err);
                    response.send(500, { error: 'Error calling Authentication provider' });
                    return;
                }

                if (resp.statusCode !== 200) {
                    logger.error(iM + ': Provider call did not return success: ', resp.statusCode);
                    response.send(500, { error: 'Provider call did not return success: ' + resp.statusCode });
                    return;
                }

                try {
                    logger.info(iM + ': success: got User Details body ', body);
                    var theAppUser = oAuthUser_To_appUser(theProvdr, JSON.parse(body));

                    addUser(theAppUser, user, {
                        success: function(userAlreadyExist, userEnt){
                            logger.info( iM + ': addUser: success', userEnt);
                            response.send(200, getAppUserEnt(userEnt));
                        },
                        error: function(err){
                            logger.error( iM + ': Error in addUser: ', err);
                            response.send(500, { error: err.message });
                        }
                    });

                } catch (err) {
                    logger.info(iM + ': Error parsing response: ', err);
                    response.send(500, { error: err.message });
                }
            });
    },
    error: function(err){
        logger.info(iM + ': error on calling getIdentities: - ' , err);
        response.send(500, { error: err.message });
    }
});



在azure服务日志中,当从cordova项目运行时,我看不到自定义api的user.insert函数记录的条目,这意味着api被调用。如前所述,从VS web项目调用时,日志记录看起来都很好。
(这有点类似于here提出的问题,但不完全相同。)
我无法弄清楚为什么会发生这种情况;任何想法?

1 个答案:

答案 0 :(得分:0)

您是在设备,模拟器还是Ripple上运行?如果是Ripple,则必须将Cross Domain Proxy更改为“disabled”。我有类似的问题,这似乎有所帮助。