• 如何针对 Node 运行时引入第三方包
    • 引用 Lodash 第三方包

    如何针对 Node 运行时引入第三方包

    声明

    • 本文测试所用设备系统为 Ubuntu18.04
    • 运行模式为 docker 容器模式,native 进程模式配置流程相同
    • Node 版本为 8.5
    • 模拟 MQTT client 行为的客户端为 MQTTBox
    • 本文选择引入 Lodash 这个第三方包来进行演示说明
    • 本文中基于 Hub 模块创建的服务名称为 localhub 服务。并且针对本文的测试案例中,对应的 localhub 服务、函数计算服务以及其他服务的配置统一如下:
    1. # localhub 配置
    2. # 配置文件位置: var/db/baetyl/localhub-conf/service.yml
    3. listen:
    4. - tcp://0.0.0.0:1883
    5. principals:
    6. - username: 'test'
    7. password: 'hahaha'
    8. permissions:
    9. - action: 'pub'
    10. permit: ['#']
    11. - action: 'sub'
    12. permit: ['#']
    13.  
    14. # 本地 baetyl-function-manager 配置
    15. # 配置文件位置: var/db/baetyl/function-manager-conf/service.yml
    16. hub:
    17. address: tcp://localhub:1883
    18. username: test
    19. password: hahaha
    20. rules:
    21. - clientid: localfunc-1
    22. subscribe:
    23. topic: node
    24. function:
    25. name: sayhi
    26. publish:
    27. topic: t/hi
    28. functions:
    29. - name: sayhi
    30. service: function-sayhi
    31. instance:
    32. min: 0
    33. max: 10
    34. idletime: 1m
    35.  
    36. # application.yml配置
    37. # 配置文件位置: var/db/baetyl/application.yml
    38. version: v0
    39. services:
    40. - name: localhub
    41. image: hub.baidubce.com/baetyl/baetyl-hub
    42. replica: 1
    43. ports:
    44. - 1883:1883
    45. mounts:
    46. - name: localhub-conf
    47. path: etc/baetyl
    48. readonly: true
    49. - name: localhub-data
    50. path: var/db/baetyl/data
    51. - name: localhub-log
    52. path: var/log/baetyl
    53. - name: function-manager
    54. image: hub.baidubce.com/baetyl/baetyl-function-manager
    55. replica: 1
    56. mounts:
    57. - name: function-manager-conf
    58. path: etc/baetyl
    59. readonly: true
    60. - name: function-manager-log
    61. path: var/log/baetyl
    62. - name: function-sayhi
    63. image: hub.baidubce.com/baetyl/baetyl-function-node85
    64. replica: 0
    65. mounts:
    66. - name: function-sayjs-conf
    67. path: etc/baetyl
    68. readonly: true
    69. - name: function-sayjs-code
    70. path: var/db/baetyl/function-sayhi
    71. readonly: true
    72. volumes:
    73. # hub
    74. - name: localhub-conf
    75. path: var/db/baetyl/localhub-conf
    76. - name: localhub-data
    77. path: var/db/baetyl/localhub-data
    78. - name: localhub-log
    79. path: var/db/baetyl/localhub-log
    80. # function manager
    81. - name: function-manager-conf
    82. path: var/db/baetyl/function-manager-conf
    83. - name: function-manager-log
    84. path: var/db/baetyl/function-manager-log
    85. # function node runtime sayhi
    86. - name: function-sayjs-conf
    87. path: var/db/baetyl/function-sayjs-conf
    88. - name: function-sayjs-code
    89. path: var/db/baetyl/function-sayjs-code

    系统自带的 Node 环境有可能不会满足我们的需要,实际使用往往需要引入第三方库,下面给出示例。

    引用 Lodash 第三方包

    Lodash 是一个一致性、模块化、高性能的 JavaScript 实用工具库。我们可以引入第三方库 Lodash 来使用它的功能。如何引入,具体如下所示:

    • 步骤 1: 进入 js 脚本目录,然后下载 Lodash
    1. cd /directory/of/Node/script
    2. npm install --save lodash
    • 步骤 2: 在具体执行脚本中引入第三方库 Lodash,如下所示:
    1. const _ = require('lodash');
    • 步骤 3: 执行脚本
    1. node your_script.js

    如上述操作正常,则形成的脚本目录结构如下图所示。

    ../_images/node-third-lib-dir-Lodash.pngNode Lodash 第三方库脚本目录

    下面,我们编写脚本 index.js 来使用 Lodash 提供的功能,具体如下:

    1. #!/usr/bin/env node
    2.  
    3. const _ = require('lodash');
    4.  
    5. exports.handler = (event, context, callback) => {
    6. result = {}
    7.  
    8. //筛选数组中重复元素
    9. result["unique_array"] = _.uniq(event['array']);
    10. //排序
    11. result['sorted_users'] = _.sortBy(event['users'], function(o) { return o.age; });
    12. //过滤
    13. result['filtered_users'] = _.filter(event['users'], function(o) { return !o.active; });
    14.  
    15. callback(null, result);
    16. }

    函数运行时服务的配置如下:

    1. # node function 配置
    2. functions:
    3. - name: 'sayhi'
    4. handler: 'index.handler'
    5. codedir: 'var/db/baetyl/function-sayhi'

    首先定义如下的 json 数据作为输入消息:

    1. {
    2. "array": ["Jane", 1, "Jane", 1, 2],
    3. "users": [
    4. { "user": "barney", "age": 36, "active": true },
    5. { "user": "fred", "age": 40, "active": false },
    6. { "user": "Jane", "age": 32, "active": true }
    7. ]
    8. }

    如上,localhub 服务接收到发送到主题 node 的消息后,会调用 index.js 脚本执行具体逻辑,对消息中的数组执行重复元素筛选、元素排序、元素按条件过滤等操作。然后将执行结果以 MQTT 消息形式反馈给主题 t/hi。我们通过 MQTTBox 订阅主题 t/hi,可以观察到如下消息:

    1. {
    2. "unique_array": ["Jane", 1, 2],
    3. "sorted_users": [
    4. { "user": "Jane", "age": 32, "active": true },
    5. { 'user': 'barney', "age": 36, "active": true },
    6. { "user": "fred", "age": 40, "active": false }
    7. ],
    8. "filtered_users": [
    9. { "user": "fred", "age": 40, "active": false }
    10. ],
    11. }

    ../_images/write-node-script-third-lib-Lodash.pnglodash数据处理