在 Loopback 'Before Save' 挂钩中实现回调
Implement Callbacks in Loopback 'Before Save' hook
美好的一天!我对 Node.js 和 Loopback 还很陌生。下面让我发疯。
我想将属性值写入 "before save" 上的模型实例。我从调用 REST 调用中得到一个值:
ctx.instance.hash
然后,我需要调用 REST API,获取响应,并将值写入模型。从 API 调用获取值有效,但我从另一个函数获取值。
但我无法将值返回到原始函数的范围内,因此执行以下操作:
tx.instance.somedata = externalData;
我试过:
1. 使它成为一个全局变量,但在原来的调用函数中,该值仍然是 "undef"。
2. 对值
做一个"Return"
两者都无济于事 - 值仍然是 "undefined"
我在想变量永远不会被填充,我需要使用回调,但我不确定在这种情况下如何实现回调函数。
任何指点或帮助将不胜感激,谢谢!
module.exports = function(Blockanchor) {
Blockanchor.observe('before save', function GetHash(ctx, next) {
if (ctx.instance) {
//console.log('ctx.instance', ctx.instance)
var theHash = ctx.instance.hash; //NB - This variable is required for the external API call to get the relevant data
//Run below functions to call an external API
//Invoke function
ExternalFunction(theHash);
//See comment in external function, I do not know how to get that external variable here, to do the following:
ctx.instance.somedata = externalData;
}
next();
}); //Blockanchor.observe
}//module.exports = function(Blockanchor)
Function ExternalFunction(theHash){
//I successfully get the data from the external API call into the var "externalData"
var externalData = 'Foo'
//THIS IS MY PROBLEM, how do I get this value of variable "externalData" back into the code block above where I called the external function, as I wish to add it to a field before the save occurs
}
好的,根据我的研究,我需要改变我的应用程序的工作方式,因为上面似乎没有实际的解决方案。
您应该在外部函数中实现承诺,然后等待外部 API 调用和使用 resolve 回调的 return 响应。
module.exports = function(Blockanchor) {
Blockanchor.observe('before save', function GetHash(ctx, next) {
if (ctx.instance) {
//console.log('ctx.instance', ctx.instance)
var theHash = ctx.instance.hash; //NB - This variable is required for the external API call to get the relevant data
//Run below functions to call an external API
//Invoke function
ExternalFunction(theHash).then(function(externalData){
ctx.instance.somedata = externalData;
next();
})
} else {
next();
}
}); //Blockanchor.observe
}//module.exports = function(Blockanchor)
function ExternalFunction(theHash){
return new Promise(function(resolve, reject){
var externalData = 'Foo'
resolve(externalData)
})
}
美好的一天!我对 Node.js 和 Loopback 还很陌生。下面让我发疯。
我想将属性值写入 "before save" 上的模型实例。我从调用 REST 调用中得到一个值:
ctx.instance.hash
然后,我需要调用 REST API,获取响应,并将值写入模型。从 API 调用获取值有效,但我从另一个函数获取值。
但我无法将值返回到原始函数的范围内,因此执行以下操作:
tx.instance.somedata = externalData;
我试过: 1. 使它成为一个全局变量,但在原来的调用函数中,该值仍然是 "undef"。 2. 对值
做一个"Return"两者都无济于事 - 值仍然是 "undefined"
我在想变量永远不会被填充,我需要使用回调,但我不确定在这种情况下如何实现回调函数。
任何指点或帮助将不胜感激,谢谢!
module.exports = function(Blockanchor) {
Blockanchor.observe('before save', function GetHash(ctx, next) {
if (ctx.instance) {
//console.log('ctx.instance', ctx.instance)
var theHash = ctx.instance.hash; //NB - This variable is required for the external API call to get the relevant data
//Run below functions to call an external API
//Invoke function
ExternalFunction(theHash);
//See comment in external function, I do not know how to get that external variable here, to do the following:
ctx.instance.somedata = externalData;
}
next();
}); //Blockanchor.observe
}//module.exports = function(Blockanchor)
Function ExternalFunction(theHash){
//I successfully get the data from the external API call into the var "externalData"
var externalData = 'Foo'
//THIS IS MY PROBLEM, how do I get this value of variable "externalData" back into the code block above where I called the external function, as I wish to add it to a field before the save occurs
}
好的,根据我的研究,我需要改变我的应用程序的工作方式,因为上面似乎没有实际的解决方案。
您应该在外部函数中实现承诺,然后等待外部 API 调用和使用 resolve 回调的 return 响应。
module.exports = function(Blockanchor) {
Blockanchor.observe('before save', function GetHash(ctx, next) {
if (ctx.instance) {
//console.log('ctx.instance', ctx.instance)
var theHash = ctx.instance.hash; //NB - This variable is required for the external API call to get the relevant data
//Run below functions to call an external API
//Invoke function
ExternalFunction(theHash).then(function(externalData){
ctx.instance.somedata = externalData;
next();
})
} else {
next();
}
}); //Blockanchor.observe
}//module.exports = function(Blockanchor)
function ExternalFunction(theHash){
return new Promise(function(resolve, reject){
var externalData = 'Foo'
resolve(externalData)
})
}