2017-01-03 11 views
0

私のループバックAPIアプリにセーブフックを作成しました。私が行うには、このコードを期待してい何ループバックジオポイントのフックが永続的に変更されない

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)を作ることです:私の場所のモデルは、私は次のコードを持っている私のcommon\models\location.js内のアドレスと緯度経度geopoint

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

を持っていますGoogleマップへのリクエスト、住所の緯度と経度を返し、最初のエントリを正確に予測し、そのデータをlatlngプロパティのモデルに保存します。現在、GeoPointオブジェクトとして予想される緯度と経度をコンソールに正しく出力しています。

GeoPoint { lat: 42.3675294, lng: -71.18696609999999 } 

この情報でモデルを更新するにはどうすればよいですか?私は条件付きif (ctx.instance)を削除しようとしましたが、違いはありません。私は別のオブジェクト表記を使ってみました:

ctx.instance['latlng']=latlng 

エラーは記録されていません。私はMongoDBに固執していますが、問題はメモリ内のDBを使用する場合と同じです。追加コードはGithub.com/andygauge/api.socialconnectにあります。

答えて

1

ここに問題はnext()です。 nodejの非同期性のため、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(); 
     }) 
    }) 
    }) 
}; 

は、ビューをいただき、ありがとうございます。

関連する問題