簡體   English   中英

環回Geopoint掛鈎未持久更改

[英]Loopback Geopoint Hook not persisting change

我在回送api應用程序中創建了一個保存前的鈎子。 我的位置模型有一個地址和一個latlng地理位置

  "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();
  })
};

我期望這段代碼要做的是向Google地圖發出一個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();
      })
    })
  })
};

感謝您的意見。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM