Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取Drupal服务模块JSON响应:Backbone.js模型属性变为字符串_Backbone.js_Drupal 7_Drupal Services - Fatal编程技术网

获取Drupal服务模块JSON响应:Backbone.js模型属性变为字符串

获取Drupal服务模块JSON响应:Backbone.js模型属性变为字符串,backbone.js,drupal-7,drupal-services,Backbone.js,Drupal 7,Drupal Services,我已经使用Drupal的服务模块设置了web服务。它通过Backbone.js前端应用程序为我输出JSON 我对这个设置有问题。如果我通过Backbone.js的一个模型的fetch方法请求数据,那么在获取之后,该模型的属性都被类型化为string,而有些属性应该是integer 例如: 我已经启用了用户资源,这是Drupal服务模块中的标准配置 我可以请求用户,例如: http://mydevmachine/services/user/8 …这将导致以下响应(从实际响应中精简版本):

我已经使用Drupal的服务模块设置了web服务。它通过Backbone.js前端应用程序为我输出JSON

我对这个设置有问题。如果我通过Backbone.js的一个模型的fetch方法请求数据,那么在获取之后,该模型的属性都被类型化为string,而有些属性应该是integer

例如:

  • 我已经启用了用户资源,这是Drupal服务模块中的标准配置
  • 我可以请求用户,例如:

    http://mydevmachine/services/user/8
    
…这将导致以下响应(从实际响应中精简版本):

  • 我在上面web服务的响应中看到,所有值都被引用,但是uid实际上不是字符串,而是数据库中的整数
  • 如果我在Backbone.js模型中获取相同的用户,通过将模型的uid字段设置为8(整数),然后调用fetch方法。获取后,uid字段被键入为“字符串”
我假设上述情况导致我的模型的uid属性不是integer,而是string。我使用自己的实体创建的所有其他web服务资源也会发生这种情况

我需要在我的模型中正确地键入属性,因为使用主干的集合排序存在排序问题。也就是说,使用“integer”类型的字段对模型集合进行排序时,虽然存储为字符串,但使用相同值对字段进行排序时,会导致不同的排序结果

我不确定该去哪里看:

  • Drupal服务模块输出的JSON格式是否符合标准
  • JSON输出格式在Drupal服务模块中是可配置的还是可重写的
  • 在Backbone.js中获取后是否可能保留模型属性的类型
  • 我是否应该为主干网的collection comparator函数提供一个具体的实现,该函数可以处理这种情况(看起来像hackey)
  • 我是否应该介绍其他解决方案,例如,如张贴在此处:(感觉太重)

谢谢您的帮助。

所以我终于设法解决了这个问题,我在这里找到了解决方案:。我想我应该把解决方案记录下来

Drupal7使用PDO。使用PDO获取的结果,使用Drupal的默认PDO设置会产生字符串化的值

在Drupal的includes/database.inc文件中,您可以在第40-50行找到以下内容:

$connection_options['pdo'] += array(
  // So we don't have to mess around with cursors and unbuffered queries by default.
  PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE,
  // Because MySQL's prepared statements skip the query cache, because it's dumb.
  PDO::ATTR_EMULATE_PREPARES => TRUE,
);
此处MySQL准备好的语句跳过查询缓存的说法并不完全正确,可以在此处找到:。它声明MySQL>5.1.17准备好的语句在某些条件下使用查询缓存

我使用其他堆栈溢出问题/答案中的信息覆盖Drupal的sites/default/settings.php中数据库连接的PDO设置(请注意,我只对我正在查询的数据库这样做,这与Drupal自己的数据库不同):


这导致整数成为整数。PDO仍然错误地返回浮点数/小数,但这是另一个问题。至少我的问题现在已经解决了。

您可以在主干网中设置方法作为最后手段,但必须有一种方法使您的服务器将发送的数字视为JSON中的数字。嗯,我还没有想到这个方法。事实上,如果我这样做的话,感觉有点像双重工作,但这也可能是在确保您接收正确数据的基础上的额外一层。谢谢你的回答!
$connection_options['pdo'] += array(
  // So we don't have to mess around with cursors and unbuffered queries by default.
  PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => TRUE,
  // Because MySQL's prepared statements skip the query cache, because it's dumb.
  PDO::ATTR_EMULATE_PREPARES => TRUE,
);
'database_name' =>
  array (
    'default' => 
    array (
      'database' => 'database_name',
      'username' => 'user_name',
      'password' => 'user_pass',
      'host' => 'localhost',
      'port' => '',
      'driver' => 'mysql',
      'prefix' => '',
      'pdo' => array(
        PDO::ATTR_STRINGIFY_FETCHES => FALSE,
        PDO::ATTR_EMULATE_PREPARES => FALSE
      ),
    ),
  ),