如何使用async和await这对组合设计统一的取Access Token的函数
最近我在使用SAP云平台的机器学习API做和SAP系统的集成,因为SAP Cloud Platform Leonardo上的机器学期API,每次消费时需要传一个Access Token,故在每次实际调用API前,我需要先发一个请求去获取Access Token. 该请求的响应,除了返回实际的token外,还有一个过期时间,expires_in字段:
根据OAuth 2.0标准定义,expires_in字段代表服务器颁发的该token,距离过期时间还剩的秒数。
我的代码如下:
const request = require('request-promise-native'); var config = require('../config.js'); var TOKEN = undefined; var EXPIRES_IN = undefined; var TOKEN_FETCHED_SINCE = undefined; function isCurrentDateExpired(){ var current = new Date(); var diffInMilliSeconds = current - TOKEN_FETCHED_SINCE; var diffInSecond = Math.ceil(diffInMilliSeconds/1000); var expired = diffInSecond >= EXPIRES_IN ? true:false; // for debug; // expired = true; return expired; } async function getAccessToken(){ if( TOKEN === undefined || isCurrentDateExpired()){ var raw = new Buffer(config.username + ":" + config.password); const accessToken = await request({ method: 'GET', headers: { 'Authorization': 'Basic ' + raw.toString('base64') }, url: config.ACCESS_TOKEN, json: false }); var oToken = JSON.parse(accessToken); EXPIRES_IN = oToken.expires_in; TOKEN = oToken.access_token; TOKEN_FETCHED_SINCE = new Date(); return oToken.access_token; } else{ return TOKEN; } } var request1 = getAccessToken(); var freshNewToken, secondTimeToken; request1.then(function(o){ // console.log("token1: " + o); freshNewToken = o; }); function test2(){ var b = getAccessToken(); b.then(function(o){ // console.log("token2: " + o); secondTimeToken = o; console.log("they should be equal: " + (freshNewToken == secondTimeToken)); }); } setTimeout( test2, 6000);
本文来自云栖社区合作伙伴“汪子熙”,了解相关信息可以关注微信公众号"汪子熙"。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
nodejs库express是如何接收inbound json请求的
这样几行简单的代码创建一个web服务器: var express = require('express'); var app = express(); var server = require('http').Server(app); var bodyParser = require('body-parser'); app.use(bodyParser.json({limit: '10mb', extended: true})); 然后使用app.post("/getSimilarImage", function(req, res){// 此处编写业务逻辑 }); 就可以接收json请求了。问题就是,我通过postman发送的json字符串,是如何被nodejs的express库处理的呢? 调试一下,trim_prefix的参数path即我在postman里测试的API endpoint: 调用layer的handle_request方法,这个很像SAP ABAP里的IF_HTTP_EXTENSION的HANDLE_REQUEST方法。 express中的中间件,query.js: 这...
- 下一篇
Cassandra JAVA客户端是如何做到高性能高并发的
Cassandra Java驱动程序 本文翻译至:https://beyondthelines.net/databases/the-cassandra-java-driver/同时也加上了作者阅读源码后的观后感,丰富了很多细节。 Cassandra驱动程序不是将CQL字符串发送到Cassandra节点并等待响应的傻瓜程序 它们实际上很聪明,并且以某种方式组织的,使您易于使用,工作更开心,同时仍然尝试从Cassandra中获得最大的性能。 在本文中,我将重点介绍Java驱动程序,快速了解其体系结构及其提供的某些功能。 快速使用 3.x版本 Cluster cluster = Cluster.builder().addContactPoints(contactPoints).withPort(port).build(); session = clu
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果