问题描述:
今天调用百度接口,获取token时,判断如果过期,就自动获取,结果token过期的代码可以运行,但是没过期的代码就是不执行
(代码见末尾)
原因分析:
纠结了好久,发现是时序问题,ep.all()函数必须在ep.emit()函数的前面,不然emit就找不到不到接收它的主体。。
解决办法:
将ep.all()放到ep.emit()的前面
结语:
论仔细读文档的重要性:all方法将handler注册到事件组合上。当注册的多个事件都触发后,将会调用handler执行,每个事件传递的数据,将会依照事件名顺序,传入handler作为参数。
文档地址:https://www.npmjs.com/package/eventproxy
代码
// ==================================== Baidu Unit API ===============================================
router.route('/baidu-unit-api')
.post((req, res, next)=>{
// token获取
var tokenJsonStr = fs.readFileSync('./config/baiduToken.txt')
var tokenJsonObj = JSON.parse(tokenJsonStr)
var expires = tokenJsonObj.expires
var token = tokenJsonObj.token
var timeStamp = Date.now()
console.log(' expires:' + expires + ', currentTimeStamp:' + timeStamp)
// 输入文本(对话的问题)
// 放在ep.emit()前面
ep.all('setToken', (token)=>{
var text = req.body.text
const logId = Date.now()
const options = {
url: 'https://aip.baidubce.com/rpc/2.0/unit/bot/chat?access_token=' + token,
method: 'POST',
headers: {
'Content-Type': 'application/json; charset=UTF-8'
},
// body 只接受 string or Buffer,且header中类型为 json
body:JSON.stringify({
version: '2.0',
bot_id: '68010',
log_id: logId,
request:{
'user_id': 'UNIT_DEV_V11J',
'query_info':{
'asr_candidates': [],
'type': 'TEXT',
'source': 'KEYBOARD'
},
'query': text,
'bernard_level': 1
},
bot_session:''
})
}
function callback(error, response, body) {
if (!error && response.statusCode == 200) {
const info = JSON.parse(body);
console.log(body)
if(info.error_msg){
res.send(new Error(info.error_msg))
}else{
console.log('=== result: ', info.result.response.action_list[0].say)
res.send(new Success(info))
}
}else{
console.log('=== response', response)
console.log('=== body', body)
console.log('=== error: ', error)
}
}
request(options, callback);
})
if(expires < timeStamp){
// 调用api获取token 并写入文件保存
getBaiduToken()
ep.all('getBaiduToken', (jsonBody)=>{
// 写入文件
token = jsonBody.access_token
// baiduUnitAccessToken = jsonBody.access_token
var timestamp = Date.now()
var expires_in = jsonBody.expires_in * 1000 // s -> ms
var configJson = {'token': jsonBody.access_token, 'expires': timestamp + expires_in }
fs.writeFileSync('./config/baiduToken.txt', JSON.stringify(configJson))
// 放在ep.all 后面
ep.emit('setToken', token)
})
}else{
// 放在ep.all 后面
ep.emit('setToken', token)
}
})
function getBaiduToken(){
const options = {
url: 'https://aip.baidubce.com/oauth/2.0/token',
method: 'POST',
form:{
grant_type: 'client_credentials',
client_id: baiduUnitApiKey,
client_secret: baiduUnitSecretKey
}
}
function callback(error, response, body) {
if (!error && response.statusCode == 200) {
const jsonBody = JSON.parse(body);
console.log('=== result: ', body)
ep.emit('getBaiduToken', jsonBody)
}
}
request(options, callback);
}