【问题标题】:How to use geocode function more than once in the same post request (npm: node-geocoder)?如何在同一个发布请求中多次使用地理编码功能(npm:node-geocoder)?
【发布时间】:2020-07-01 16:05:25
【问题描述】:

我一直在尝试创建一个function returnCoords(par1),用户可以在其上输入文本输入,并使用node-geocoder npm 将其转换为坐标。尽管该函数看起来工作正常,但在返回该函数时,它会给出undefined 结果。我尝试使用 asyncawait 解决此问题,但无论有没有这些,似乎都没有任何效果。

我也尝试在 geocoder.geocode(array/object, async function(err, data){...}) 中传递一个对象/数组(两个文本),但似乎也不起作用,因为它只接受 String 值。

var express = require('express');
var router = express.Router();
var nodeGeocoder = require('node-geocoder');

var geocoderOptions = {
    provider: "google",
    httpAdapter: "https",
    apiKey: process.env.GEOCODER_API_KEY, //collect key from hidden environment variable
    formatter: null
}

var geocoder = nodeGeocoder(geocoderOptions);

router.post('/updateMap', async (req, res) => {
    //GET USER TEXT (MAP) INPUT & convert to coordinates  
    //req.body.mapFrom: "LA, USA"  
    var from_coords = await returnCoords(req.body.mapFrom);

    console.log("TEST 1:" + typeof(from_coords));
    console.log("TEST 2:" + from_coords);
    //console.log("TEST 3:" + from_coords[0]);
    //console.log("TEST 4:" + from_coords[0].latitude);
    //console.log("TEST 5:" + from_coords[0].longitude);
    
});

async function returnCoords(userInput){
    geocoder.geocode(userInput, async function(err, data){

        if(err || !data.length) {
            req.flash('error', 'Invalid address');
            return res.redirect('back');
        }
        
        console.log("LAT:" + data[0].latitude);
        console.log("LNG:" + data[0].longitude);
        
        return data;
    });
}

CONSOLE LOG 按此顺序打印:

TEST 1 : undefined
TEST 2 : undefined
LAT    : 34.0522342
LNG    : -118.2436849

解决方案:

router.post('/updateMap', async (req, res) => {
    //GET USER TEXT (MAP) INPUT & convert to coordinates    
    let from_coords = await geocoder.geocode(req.body.mapFrom);
    let to_coords = await geocoder.geocode(req.body.mapTo);
    var method = req.body.mapMethod; //Radio Button Input

    console.log("FROM   : " + from_coords[0].longitude +" , "+from_coords[0].latitude);
    console.log("TO     : " + to_coords[0].longitude +" , "+to_coords[0].latitude);
    console.log("METHOD : " + method);
});
FROM   : -118.2436849 , 34.0522342 //(LA, USA)
TO     : -119.4179324 , 36.778261  //(CA, USA)
METHOD : walk

【问题讨论】:

    标签: javascript node.js function geocode geocoder


    【解决方案1】:

    returnCoords 给出您的意图是无效的(您不想“分叉”地理编码功能),但返回 Promisegeocode 结果解析。

    注意geocoder.geocode 支持基于Promise 的API*,因此只需将returnCoords 更改为:

    async function returnCoords(userInput) {
        const data = await geocoder.geocode(userInput);
        ... // logs and stuff
        return data
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 2020-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多