前几天寻思给自己的毕设加一个人脸识别的功能,就想到了百度的AI开放平台,首先要申请access_token,以下是官方的node实例代码。
var https = require('https');
var qs = require('querystring');
const param = qs.stringify({
'grant_type': 'client_credentials',
'client_id': '您的 Api Key',
'client_secret': '您的 Secret Key'
});
https.get(
{
hostname: 'aip.baidubce.com',
path: '/oauth/2.0/token?' + param,
agent: false
},
function (res) {
// 在标准输出中查看运行结果
res.pipe(process.stdout);
}
);
res.pipe(process.stdout); 这行代码我没见过,开始我没在意,直接注掉了,想直接把res返回给前端看一下,结果前端每次请求的时候总会下载一个文件,文件里的信息是我需要的,我就很奇怪,于是我在控制台打印了一下,结果是一个有好多乱七八糟属性的对象。我还是不信邪,用postman请求了一下,返回是正常的结果。这就奇怪了,我乖乖的使用官方的代码,终于在控制台看到了自己想要的结果,于是想到了res的格式的问题,去网上浏览了一下,原来是管道通讯,在这里跟大家分享一下使用心得。
在js中,我们保存或者接收数据的时候,往往都是定义一个变量。但是如果数据量很大的话,系统就要开辟与之对应的内存,会占用较大内存,这时候就用到了pipe去进行读写流操作,更加优雅的完成任务,下面先贴代码。
(function getBaiduToken () {
https.get({
hostname: 'aip.baidubce.com',
path: '/oauth/2.0/token?' + param,
agent: false
}, function (res) {
// 在标准输出中查看运行结果
res.pipe(process.stdout);
// 写入文件
res.pipe(fs.createWriteStream('./baidu-token.json'));
}
);
})();
我写了一个立即执行函数,在服务器启动的时候从百度提供的重新获取token,接口返回的实际上是一个数据流,我们需要通过管道去接收它,res.pipe(process.stdout)的意思是将数据流输出到控制台上(这里好像还有不少有意思的东西,有时间我会去研究一下),我通过fs创建了一个写入流,这样便可以把对应的内容保存到本地对应的文件里,需要用的时候可以通过fs.readFileSync('./token.json', 'utf8');读取文件内容 , 非常方便。