Loopback Geopoint Hook不存在变化

问题描述:

我在我的loopback API应用程序中创建了一个保存钩子之前。我的位置模型有一个地址和经纬度的GeoPointLoopback Geopoint Hook不存在变化

"properties": { 
    "name": { 
     "type": "string" 
    }, 
    "address": { 
     "type": "string" 
    }, 
    "latlng": { 
     "type": "geopoint" 
    } 
    }, 

在我的common\models\location.js我有以下代码:

var https = require('https'); 
var loopback = require('loopback'); 
module.exports = function(Location) { 
    Location.observe('before save', function(ctx, next) { 
    let path = `/maps/api/geocode/json?address=${ctx.instance['address']}&key=AIzaSyCWk3ePB8idTw74LyhR8tLSCmVgbZDKiIQ` 
    console.log(path); 
    https.get({ 
     hostname: 'maps.googleapis.com', 
     path: encodeURI(path) 
    }, (res) => { 
     var body = []; 
     res.on('data', (d) => { 
     body.push(d) 
     }) 
     res.on('end',() =>{ 
     body = JSON.parse(Buffer.concat(body).toString()); 
     let latlng = new loopback.GeoPoint({ 
      lat: body['results'][0]['geometry']['location']['lat'], 
      lng: body['results'][0]['geometry']['location']['lng'] 
     }) 
     console.log(latlng) 
     if (ctx.instance) { 
      ctx.instance.latlng = latlng; 
     } else { 
      ctx.data.latlng = latlng; 
     } 
     }) 
    }) 
    next(); 
    }) 
}; 

我很期待这个代码做的是使一个HTTP(S)请求谷歌地图,返回地址的经纬度,天真地预测第一个条目是正确的,并将该数据保存到我的模型的latlng属性中。我目前正在向控制台输出预期的经度和纬度,作为GeoPoint对象:

GeoPoint { lat: 42.3675294, lng: -71.18696609999999 } 

如何使用此信息更新我的模型?我试图删除没有区别的条件if (ctx.instance)。我试过使用不同的对象符号:

ctx.instance['latlng']=latlng 

没有错误被记录。我坚持使用MongoDB,但问题与使用内存数据库相同。其他代码位于Github.com/andygauge/api.socialconnect

这里的问题是next()的位置。由于nodejs的异步特性,在http请求完成并处理之前调用了next()。工作流程进入验证后,模型发生更改。

该解决方案是这样的:

module.exports = function(Location) { 
    Location.observe('before save', function(ctx, next) { 
    let path = `/maps/api/geocode/json?address=${ctx.instance['address']}&key=AIzaSyCWk3ePB8idTw74LyhR8tLSCmVgbZDKiIQ` 
    console.log(path); 
    https.get({ 
     hostname: 'maps.googleapis.com', 
     path: encodeURI(path) 
    }, (res) => { 
     var body = []; 
     res.on('data', (d) => { 
     body.push(d) 
     }) 
     res.on('end',() =>{ 
     body = JSON.parse(Buffer.concat(body).toString()); 
     let latlng = new loopback.GeoPoint({ 
      lat: body['results'][0]['geometry']['location']['lat'], 
      lng: body['results'][0]['geometry']['location']['lng'] 
     }) 
     console.log(latlng) 
     if (ctx.instance) { 
      ctx.instance.latlng = latlng; 
     } else { 
      ctx.data.latlng = latlng; 
     } 
     next(); 
     }) 
    }) 
    }) 
}; 

谢谢你的意见。