【问题标题】:fs.readFile is not a function MQTT certificatesfs.readFile 不是函数 MQTT 证书
【发布时间】:2021-12-30 04:39:55
【问题描述】:

我正在尝试读取证书以通过 js 和 node.js 访问我的 Mqtt 代理。但是我收到以下错误:fs.readFile 不是函数。

我注意到 fs 在 npm 包中似乎已弃用,因此我尝试使用 graceful-fs 和 fs-extra,但它导致了类似的错误。我也尝试将 require 更改为 import 但它没有改变任何东西。

这是我的代码:

import Mqtt from 'mqtt';
const fs = require('fs');
var caFile = fs.readFile("myCApath")
var certFile = fs.readFile("myCERTpath")
var keyFile = fs.readFile("myKEYpath")
const client = Mqtt.connect({host: 'adress', port:'1884', username:'username',password:'passwd', ca: caFile});

这是我的 package.json

{
  "name": "frontend",
  "version": "0.0.9",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build"
  },
  "dependencies": {
    "axios": "^0.19.0",
    "element-ui": "^2.11.1",
    "leaflet": "^1.5.1",
    "mqtt": "^3.0.0",
    "start": "^5.1.0",
    "vue": "^2.6.10",
    "vue-router": "^3.1.2",
    "vuex": "^3.1.1"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "^3.10.0",
    "@vue/cli-plugin-eslint": "^3.10.0",
    "@vue/cli-service": "^3.10.0",
    "@vue/eslint-config-airbnb": "^4.0.1",
    "babel-eslint": "^10.0.2",
    "babel-plugin-component": "^1.1.1",
    "eslint": "^6.2.0",
    "eslint-plugin-vue": "^5.2.3",
    "vue-cli-plugin-element": "^1.0.1",
    "vue-template-compiler": "^2.6.10"
  },
  "eslintConfig": {
    "root": true,
    "env": {
      "node": true
    },
    "extends": [
      "plugin:vue/essential",
      "@vue/airbnb"
    ],
    "rules": {
      "import/extensions": [
        "error",
        "always",
        {
          "js": "never",
          "vue": "never"
        }
      ],
      "no-param-reassign": [
        "error",
        {
          "props": true,
          "ignorePropertyModificationsFor": [
            "state",
            "acc",
            "e",
            "s"
          ]
        }
      ],
      "max-len": [
        "off"
      ],
      "vue/no-unused-vars": [
        "off"
      ]
    },
    "parserOptions": {
      "parser": "babel-eslint"
    }
  },
  "postcss": {
    "plugins": {
      "autoprefixer": {}
    }
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not ie <= 8"
  ]
}

感谢您的帮助

【问题讨论】:

  • 该代码到底在哪里运行?错误是来自 NodeJS 应用程序还是来自浏览器端?
  • 我在 Spring Boot 应用程序中运行此代码,然后在浏览器控制台中出现错误,浏览器返回空白页
  • 好的,你不能从浏览器访问文件(你也不能在浏览器中为MQTT客户端设置证书,因为所有的证书处理都是由浏览器完成WebSocket连接的)
  • 哦,好的,谢谢,那你知道我怎样才能让我的前端和mqtt通信吗?
  • 这是一个完全不同的问题,您的问题中没有足够的细节来正确回答。但是基于 Websockets 的 MQTT 工作得很好,但是浏览器需要信任用于预先签署证书的 CA。

标签: javascript mqtt fs


【解决方案1】:

结束hardillb在cmets中回答的我自己的问题:

“你不能从浏览器访问文件(你也不能在浏览器中为MQTT客户端设置证书,因为所有的证书处理都是由浏览器完成WebSocket连接的)”

【讨论】:

    【解决方案2】:

    fs.readFile 是异步函数,这意味着你需要尝试在回调函数中连接。否则变量caFilecertFilekeyFile 程序读取为undefined

    你可以像这样使用Promise

    import Mqtt from 'mqtt';
    const fs = require('fs')
    
    const read = (path, type) => new Promise((resolve, reject) => {
      fs.readFile(path, type, (err, file) => {
        if (err) reject(err)
        resolve(file)
      })
    })
    
    Promise.all([read('myCApath', 'utf8'), read('myCERTpath', 'utf8'), read('myKEYpath', 'utf8')]).then((arr) => {
      const client = Mqtt.connect({host: 'adress', port:'1884', username:'username',password:'passwd', ca: arr[0]});
    });
    

    另一种使用回调的方式

    import Mqtt from 'mqtt';
    const fs = require('fs');
    
    var caFile = fs.readFile("myCApath", "utf-8", function() {
      var certFile = fs.readFile("myCERTpath", "utf-8", function() {
        var keyFile = fs.readFile("myKEYpath", "utf-8", function() {
          const client = Mqtt.connect({host: 'adress', port:'1884', username:'username',password:'passwd', ca: caFile});
        })
      })
    })
    
    

    【讨论】:

    • 感谢您的回答,但两种技术仍然返回相同的错误:/
    • 能否请您在命令行中输入node -v 并告诉我您使用的是哪个版本
    • 没问题,我有版本v16.11.1
    • 您有文件package.jsonwebpack.config.js 吗?你能提供这些文件的内容吗
    • 我会将我的 package.json 添加到主要问题中,我还有一个 package-lock.json,我也应该显示它吗?
    【解决方案3】:

    使用fs.readFileSync(path)docs

    import Mqtt from 'mqtt';
    const fs = require('fs');
    var caFile = fs.readFileSync("myCApath")
    var certFile = fs.readFileSync("myCERTpath")
    var keyFile = fs.readFileSync("myKEYpath")
    const client = Mqtt.connect({host: 'adress', port:'1884', username:'username',password:'passwd', ca: caFile});
    

    【讨论】:

    • 谢谢你的回答,但是错误变成了'fs.readFileSync is not a function' :/
    • 你使用的是什么版本的 NodeJS?
    • 我正在使用节点 v16.11.1
    • fs 是一个核心模块,fs.readFileSync() 自 v0.1.8 起已包含在内。 edit 为您的项目包含 package.json 的问题。 (我假设您已尝试安装 fs 节点的版本,您不需要这样做)
    • 我刚刚编辑了问题并包含了 package.json,我在 node_modules 中找不到 fs
    【解决方案4】:

    fs.readFile 需要 3 个参数。 fs.readFile('fileName', 'utf8', function) 这里的函数将是回调函数来处理错误或获取所需的数据。 你可以试试这个:-

    var caFile = fs.readFile('myCApath.txt', 'utf8', function(err, data){
        if(err){
           console.log(err);
        }else{      
          return data; 
        }
    });
    

    如果要忽略第二个参数可以忽略,但我建议使用encoding

    已编辑 - 或者你可以尝试使用fs.readFileSync( path, options )

    【讨论】:

    • 感谢您的回答,但仍然返回相同的错误:/
    猜你喜欢
    • 2016-09-16
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 2019-02-06
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多