如何在同一个 post 请求中多次使用地理编码功能(npm:node-geocoder)?
How to use geocode function more than once in the same post request (npm: node-geocoder)?
我一直在尝试创建一个 function returnCoords(par1)
,用户可以在上面输入文本,并使用 node-geocoder
npm 将其转换为坐标。虽然该函数看起来工作正常,但在返回函数时它会给出 undefined
结果。我尝试用 async
和 await
解决这个问题,但似乎没有任何效果,无论有没有这些。
我也尝试在 geocoder.geocode(array/object, async function(err, data){...})
中传递一个 object/array(两个文本),但似乎也不起作用,因为它只接受 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
returnCoords
给出您的意图无效(您不想“分叉”地理编码功能),但 return Promise
解析为 geocode
结果。
请注意 geocoder.geocode
支持基于 Promise
的 API*,因此只需将 returnCoords
更改为:
就足够了
async function returnCoords(userInput) {
const data = await geocoder.geocode(userInput);
... // logs and stuff
return data
}
我一直在尝试创建一个 function returnCoords(par1)
,用户可以在上面输入文本,并使用 node-geocoder
npm 将其转换为坐标。虽然该函数看起来工作正常,但在返回函数时它会给出 undefined
结果。我尝试用 async
和 await
解决这个问题,但似乎没有任何效果,无论有没有这些。
我也尝试在 geocoder.geocode(array/object, async function(err, data){...})
中传递一个 object/array(两个文本),但似乎也不起作用,因为它只接受 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
returnCoords
给出您的意图无效(您不想“分叉”地理编码功能),但 return Promise
解析为 geocode
结果。
请注意 geocoder.geocode
支持基于 Promise
的 API*,因此只需将 returnCoords
更改为:
async function returnCoords(userInput) {
const data = await geocoder.geocode(userInput);
... // logs and stuff
return data
}