ReferenceError:Github Actions Jest 脚本中未定义 TextEncoder

Zac*_*ack 1 mongodb jestjs github-actions

我遇到一个仅在我的 Github Actions 工作流程中发生的错误(当我在本地运行 Jest 脚本时,没有问题)。我只找到了这个答案这个答案,但错误仍然存​​在。关于下一步要检查什么有什么想法吗?

\n

这是错误:

\n
> jest server/test/test --config=server/test/jest.config.js\n\nFAIL server/test/test.js\n  \xe2\x97\x8f Test suite failed to run\n\n    ReferenceError: TextEncoder is not defined\n\n      at Object.<anonymous> (../../node_modules/mongodb-connection-string-url/node_modules/whatwg-url/dist/encoding.js:2:21)\n      at Object.<anonymous> (../../node_modules/mongodb-connection-string-url/node_modules/whatwg-url/dist/url-state-machine.js:5:34)\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的 Jest 配置和脚本:

\n

笑话配置.js

\n
module.exports = {\n    preset: \'@shelf/jest-mongodb\'\n};\n
Run Code Online (Sandbox Code Playgroud)\n

测试.js

\n
const dotenv = require(\'dotenv\');\nconst path = require(\'path\');\nprocess.env = dotenv.config({path: path.resolve(__dirname, \'.env\')}).parsed;\n\nconst request = require(\'supertest\');\nconst {app, server} = require(\'../server\');\nconst { MongoClient } = require(\'mongodb\');\nconst { TextEncoder } = require(\'util\');\n\nglobal.TextEncoder = TextEncoder;\n\ndescribe(\'GET /\', () => {\n    let mongoClient;\n\n    beforeAll(async () => {\n        app.locals.mongoClient = mongoClient = await MongoClient.connect(process.env.MONGODB_URI, { useNewUrlParser: true, useUnifiedTopology: true });;\n    });\n\n    afterAll(async () => {\n        await mongoClient.close();\n        server.close();\n    });\n\n    it(\'responds with path of /\', (done) => {\n        request(app).get(\'/\').expect(JSON.stringify({path: \'/\'}), done);\n    });\n});\n
Run Code Online (Sandbox Code Playgroud)\n

我的 Github Actions 工作流程在以下步骤出错npm run test-server

\n
name: cicd\non:\n  push:\n    branches: [ master ]\n  pull_request:\n    branches: [ master ]\njobs:\n  build:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        node-version: [ 10.x, 12.x, 14.x, 15.x ]\n      fail-fast: false\n    steps:\n    - uses: actions/checkout@v2\n    - name: Create environment variables\n      run: |\n        touch server/test/.env\n        echo MONGODB_URI=${{ secrets.QA_MONGODB_URI }} >> server/test/.env\n\n    - name: Node.js ${{ matrix.node-version }}\n      uses: actions/setup-node@v2\n      with:\n        node-version: ${{ matrix.node-version }}\n    - run: npm ci\n    - run: npm run build --if-present\n    - run: npm run test-server\n  deploy:\n    needs: build\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v2\n    - uses: akhileshns/heroku-deploy@v3.12.12\n      with:\n        heroku_api_key: ${{ secrets.HEROKU_API_KEY }}\n        heroku_app_name: "my-app-name"\n        heroku_email: "my-email"\n
Run Code Online (Sandbox Code Playgroud)\n

小智 5

我遇到了同样的问题,只是在顶部插入了两行

global.TextEncoder = require("util").TextEncoder;

global.TextDecoder = require("util").TextDecoder;

参考:ReferenceError:TextEncoder 未使用 mongodb 节点定义

global.TextEncoder = require("util").TextEncoder;
global.TextDecoder = require("util").TextDecoder;
import { MongoMemoryServer } from 'mongodb-memory-server';
import mongoose from 'mongoose';


let mongod: MongoMemoryServer;

beforeAll(async () => {

  const mongod = await MongoMemoryServer.create();
  const mongoUri =  mongod.getUri();

  await mongoose.connect(mongoUri);
});

beforeEach(async () => {
  const collections = await mongoose.connection.db.collections();

  for (let collection of collections) {
    await collection.deleteMany({});
  }
});

afterAll(async () => {
  await mongod.stop(true);
  await mongoose.connection.close();
});
Run Code Online (Sandbox Code Playgroud)

  • 该解决方案自 2022 年起不再适用。 (6认同)