node.js 中返回的 unirest 响应未定义
Returned unirest response in node.js is undefined
我正在开发 facebook 机器人,但我绝不是 node.js 开发人员,这是我第一次使用它,因为我想稍微离开我的舒适区。
这是我的请求函数
function requestExc() {
var resDictionary = {}
unirest.get("http://openapi.ro/api/exchange/" + queryDict["code"] + ".json")
.query({"date" : queryDict["date"]})
.end(function(res) {
if (res.error) {
console.log('GET error', res.error)
} else {
console.log('GET response', res.body)
resDictionary["rate"] = res.body["rate"]
resDictionary["date"] = res.body["date"]
}
})
console.log("resDictionary IS " + resDictionary)
///prints resDictionary IS [object Object]
return resDictionary
}
所以我想得到它的结果
var response = requestExc()
if (response !== null) {
respondToSender(response, sender)
}
然后采取相应的行动
function respondToSender(res, sender) {
console.log("RES IS " + res)
//prints RES IS [object Object]
if (res["rate"] === null) {
//do stuff
}
}
但是当变量到达 respondToSender 时它总是未定义的。
TypeError: Cannot read property 'rate' of undefined
我也试过 Json.parse() 但它是一回事。
好的,问题是 unirest(像许多 node.js 模块一样)异步工作,这意味着您的代码很可能按以下顺序执行:
var response = requestExc() // request is sent first, ok
if (response !== null) { // this is done second
respondToSender(response, sender)
}
// the response arrived third, when it is not needed
所以要处理这些东西,你必须使用回调/end
方法。参见示例 here:
unirest.post('http://mockbin.com/request')
.query('name=nijiko')
.query({
pet: 'spot'
})
.end(function (response) {
console.log(response); // this is where you should use respondToSender
});
console.log(response);
仅在收到回复时启动,这就是您想要的。
reddit 的人教我如何添加回调,现在它可以正常工作了。完整代码为:
// GET a resource
function requestExc(callback) {
unirest.get("http://openapi.ro/api/exchange/" + queryDict["code"] + ".json")
.query({"date" : queryDict["date"]})
.end(function(res) {
if (res.error) {
console.log('GET error', res.error)
callback(res.error, null)
} else {
console.log('GET response', res.body)
callback(null, res.body)
}
})
}
我称之为
var response = requestExc(function(error, res) {
console.log("date array is " + dateArray)
if (error === null) {
respondToSender(res["rate"], res["date"], sender, queryDict)
} else {
sendTextMessage(sender, "Imi pare rau, dar am intimpinat o problema in comunicarea cu BNR")
}
})
我将其包装在 Promise
中以使其正常工作,想知道这是否合适以及是否有帮助?
return new Promise((resolve, reject) => {
unirest('GET', 'https://url')
.headers({
'Accept': 'application/json'
})
.send("")
.then(function (response) {
if(!response.error) {
resolve(response)
} else {
reject(response)
}
})
});
我正在开发 facebook 机器人,但我绝不是 node.js 开发人员,这是我第一次使用它,因为我想稍微离开我的舒适区。
这是我的请求函数
function requestExc() {
var resDictionary = {}
unirest.get("http://openapi.ro/api/exchange/" + queryDict["code"] + ".json")
.query({"date" : queryDict["date"]})
.end(function(res) {
if (res.error) {
console.log('GET error', res.error)
} else {
console.log('GET response', res.body)
resDictionary["rate"] = res.body["rate"]
resDictionary["date"] = res.body["date"]
}
})
console.log("resDictionary IS " + resDictionary)
///prints resDictionary IS [object Object]
return resDictionary
}
所以我想得到它的结果
var response = requestExc()
if (response !== null) {
respondToSender(response, sender)
}
然后采取相应的行动
function respondToSender(res, sender) {
console.log("RES IS " + res)
//prints RES IS [object Object]
if (res["rate"] === null) {
//do stuff
}
}
但是当变量到达 respondToSender 时它总是未定义的。
TypeError: Cannot read property 'rate' of undefined
我也试过 Json.parse() 但它是一回事。
好的,问题是 unirest(像许多 node.js 模块一样)异步工作,这意味着您的代码很可能按以下顺序执行:
var response = requestExc() // request is sent first, ok
if (response !== null) { // this is done second
respondToSender(response, sender)
}
// the response arrived third, when it is not needed
所以要处理这些东西,你必须使用回调/end
方法。参见示例 here:
unirest.post('http://mockbin.com/request')
.query('name=nijiko')
.query({
pet: 'spot'
})
.end(function (response) {
console.log(response); // this is where you should use respondToSender
});
console.log(response);
仅在收到回复时启动,这就是您想要的。
reddit 的人教我如何添加回调,现在它可以正常工作了。完整代码为:
// GET a resource
function requestExc(callback) {
unirest.get("http://openapi.ro/api/exchange/" + queryDict["code"] + ".json")
.query({"date" : queryDict["date"]})
.end(function(res) {
if (res.error) {
console.log('GET error', res.error)
callback(res.error, null)
} else {
console.log('GET response', res.body)
callback(null, res.body)
}
})
}
我称之为
var response = requestExc(function(error, res) {
console.log("date array is " + dateArray)
if (error === null) {
respondToSender(res["rate"], res["date"], sender, queryDict)
} else {
sendTextMessage(sender, "Imi pare rau, dar am intimpinat o problema in comunicarea cu BNR")
}
})
我将其包装在 Promise
中以使其正常工作,想知道这是否合适以及是否有帮助?
return new Promise((resolve, reject) => {
unirest('GET', 'https://url')
.headers({
'Accept': 'application/json'
})
.send("")
.then(function (response) {
if(!response.error) {
resolve(response)
} else {
reject(response)
}
})
});