打印一个字符串会返回一个错误,但首先使用JSON进行字符串化,不会

时间:2018-04-28 00:49:53

标签: javascript node.js string geocoding

我使用地理编码器与节点反向查找一些gps坐标。这是我使用的代码:

var geocoder = require('node-geocoder');

var geo = geocoder({provider: 'google'});
geo.reverse({lat: 53.409702, lon: -1.429981}, function(error, result) {
    console.log(JSON.stringify(result[0].city));  //Always prints sheffield
    console.log(result[0].city); //Always throws error
});

所以真的很奇怪,每当我尝试记录这个城市时,它都会给出错误:无法读取未定义的属性0。这与承诺有关,我在另一篇SO帖子中看到了这一点。我认为它具体到地理编码器。

无论如何,如果我首先将其字符串化,它将始终打印,在这种情况下,谢菲尔德。由于城市的类型是一个字符串,为什么会这样做?我很好用它但我很好奇为什么字符串字符串在没有

的情况下抛出错误时起作用

1 个答案:

答案 0 :(得分:0)

这并没有完全“回答”你的问题...但它可能有助于解决一些问题:

  1. 我修改了你的脚本如下:

    var geocoder = require('node-geocoder');
    
    var geo = geocoder({provider: 'google'});
    var r = null;
    geo.reverse({lat: 53.409702, lon: -1.429981}, function(error, result) {
        r = result;
        var r2 = result;
        var r3 = {animal:"moose"};
        console.log(JSON.stringify(result[0].city));  //Always prints sheffield
        // console.log(result[0].city); //Always throws error
    });
    console.log("Done.");
    
  2. 我在调试器中运行并在console.log语句中设置断点(“set breakpoint”,第9行):

    node inspect tmp.js
    < Debugger listening on ws://127.0.0.1:9229/8bda9a9f-9735-4a5a-9cc2-9312e9ae2123
    ...
    debug> list(10)
    > 1 (function (exports, require, module, __filename, __dirname) { var geocoder = require('node-geocoder');
      2
      3 var geo = geocoder({provider: 'google'});
      4 var r = null;
      5 geo.reverse({lat: 53.409702, lon: -1.429981}, function(error, result) {
      6     r = result;
      7     var r2 = result;
      8     var r3 = {animal:"moose"};
      9     console.log(JSON.stringify(result[0].city));  //Always prints sheffield
     10     // console.log(result[0].city); //Always throws error
     11 });
    debug> sb(9)
    debug> c
    < Done.
    break in tmp.js:9
    ...
    
  3. 打印出“结果”的值:

    debug> repl
    Press Ctrl + C to leave debug repl
    > r3
    { animal: 'moose' }
    > result
    [ Object, raw: Object ]
    > result[0]
    { formattedAddress: '84 Holywell Heights, Sheffield, UK',
      latitude: 53.4100017,
      longitude: -1.4295795,
      extra: Object,
      administrativeLevels: Object,
      ... }
    
  4. 换句话说,“结果”是一个复杂的对象...而console.log()似乎“尽力而为”,打印出“无论它能做什么”

    一个解决方案:

    1. 分析相关对象(使用“repl”调试器命令,Chrome开发者工具,无论如何)。

    2. “裁缝”你的console.log。

    3. 例如:console.log(result[0].formattedAddress);