参考错误:未定义 TextEncoder

5 javascript firefox-addon firefox-addon-sdk

我正在 Linux 上的 Firefox - 24 中编写一个简单的插件。我收到错误:

ReferenceError: TextEncoder is not defined
Run Code Online (Sandbox Code Playgroud)

当我这样做时: var encoder = new TextEncoder(); 我正在使用的功能是:

function write_text(filename, text) {
    var encoder = new TextEncoder();
    var data = encoder.encode(text);
    Task.spawn(function() {
       let pfh =  OS.File.open("/tmp/foo", {append: true});
       yield pfh.write(text);
       yield pfh.flush();
       yield pfh.close(); 
    });
}
Run Code Online (Sandbox Code Playgroud)

小智 61

如果您在运行节点服务器时遇到此错误

找到该文件node_modules/whatwg-url/dist/encoding.js.../lib/encoding.js

在顶部添加这一行const { TextEncoder, TextDecoder } = require("util");

  • 这有效,但路径已更改为“node_modules/whatwg-url/lib/encoding.js” (9认同)

Dea*_*ada 18

如果您因为使用 Mongodb via 而遇到这种情况,npm install mongodb那么最简单的方法就是升级您的 Node 版本。需要高于12版本;我使用了版本 16,它清楚地解决了我的问题


Die*_*epa 15

在 nodejs 中,您可以使用 util 解决:

var util= require('util');
var encoder = new util.TextEncoder('utf-8');
Run Code Online (Sandbox Code Playgroud)

  • 这个要在哪里添加呢? (9认同)

Sah*_*mar 14

  1. 此问题仅出现在节点 10 或更低版本中。解决这个问题upgrade node version to 12 or higher然后rm -rf node_modules && npm i

  2. 或者如果您不想升级节点版本,那么,

    找到这个文件

    node_modules/whatwg-url/dist/encoding.js // If dist folder
    
    node_modules/whatwg-url/lib/encoding.js // If lib folder
    
    Run Code Online (Sandbox Code Playgroud)

    并在encoding.js文件中添加这一行

    const { TextEncoder, TextDecoder } = require("./utils"); // if utils file
    
    const { TextEncoder, TextDecoder } = require("./util"); // if util file
    
    Run Code Online (Sandbox Code Playgroud)


nma*_*ier 5

啊,你正在使用 SDK,我在重新阅读你的另一个问题的实际错误时收集到。

  • 您需要TextEncoder从其他某个模块显式导入,因为 SDK 模块缺少该类。
  • 你需要yieldOS.File.open。
  • append: 仅在 Firefox 27+ 中受支持
  • .flush()仅在 Firefox 27+ 中受支持(无论如何都是个坏主意)。.writeAtomic如果需要,请使用。
  • write: true写一个文件。

这是我在 Firefox 25 ( main.js) 中测试的完整工作示例

const {Cu} = require("chrome");
// It is important to load TextEncoder like this using Cu.import()
// You cannot load it by just |Cu.import("resource://gre/modules/osfile.jsm");|
const {TextEncoder, OS} = Cu.import("resource://gre/modules/osfile.jsm", {});
const {Task} = Cu.import("resource://gre/modules/Task.jsm", {});

function write_text(filename, text) {
    var encoder = new TextEncoder();
    var data = encoder.encode(text);
    filename = OS.Path.join(OS.Constants.Path.tmpDir, filename);
    Task.spawn(function() {
       let file = yield OS.File.open(filename, {write: true});
       yield file.write(data);
       yield file.close(); 
       console.log("written to", filename);
    }).then(null, function(e) console.error(e));
}

write_text("foo", "some text");
Run Code Online (Sandbox Code Playgroud)


小智 5

我也遇到了这个错误,所以我用这种方式解决了它,在nodejs项目中转到node_modules/whatwg-url/dist/encoding.js文件中添加此行=>

const {TextDecoder, TextEncoder} = require("util");
Run Code Online (Sandbox Code Playgroud)

你的问题已经解决了

  • 如果您需要重新安装 npm 软件包或更新等,这将是一个问题。您将如何跟踪此更改? (4认同)
  • 什么?手动更改 dist 文件夹中的文件?这将如何在所有内容都被重建的干净部署中发挥作用? (3认同)