Loopback Geopoint Hook 不持久变化
Loopback Geopoint Hook not persisting change
我在我的环回 api 应用程序中创建了一个保存前挂钩。我的位置模型有一个地址和一个 latlng geopoint
"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) 请求,return 地址的经纬度,天真地预测第一个条目正确并在 latlng 属性 中将该数据保存到我的模型中。我目前正确地将预期的纬度和经度作为 GeoPoint 对象输出到控制台:
GeoPoint { lat: 42.3675294, lng: -71.18696609999999 }
如何使用这些信息更新我的模型?我试图删除条件 if (ctx.instance)
没有任何区别。我试过使用不同的对象表示法:
ctx.instance['latlng']=latlng
没有记录错误。我坚持使用 MongoDB,但问题与使用内存数据库相同。附加代码位于 Github.com/andygauge/api.socialconnect
这里的问题是 next()
的位置。由于 nodejs 的异步特性,next()
在 http 请求完成和处理之前被调用。模型的更改发生在工作流进行验证之后。
解决方案如下所示:
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();
})
})
})
};
感谢您的意见。
我在我的环回 api 应用程序中创建了一个保存前挂钩。我的位置模型有一个地址和一个 latlng geopoint
"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) 请求,return 地址的经纬度,天真地预测第一个条目正确并在 latlng 属性 中将该数据保存到我的模型中。我目前正确地将预期的纬度和经度作为 GeoPoint 对象输出到控制台:
GeoPoint { lat: 42.3675294, lng: -71.18696609999999 }
如何使用这些信息更新我的模型?我试图删除条件 if (ctx.instance)
没有任何区别。我试过使用不同的对象表示法:
ctx.instance['latlng']=latlng
没有记录错误。我坚持使用 MongoDB,但问题与使用内存数据库相同。附加代码位于 Github.com/andygauge/api.socialconnect
这里的问题是 next()
的位置。由于 nodejs 的异步特性,next()
在 http 请求完成和处理之前被调用。模型的更改发生在工作流进行验证之后。
解决方案如下所示:
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();
})
})
})
};
感谢您的意见。