Node学习笔记 《EventProxy》

问题描述:

今天调用百度接口,获取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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章