关于node管道pipe的基本使用

        前几天寻思给自己的毕设加一个人脸识别的功能,就想到了百度的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');读取文件内容 , 非常方便。

你可能感兴趣的:(node,技术分享)