运行pact-js消费者示例时遇Native模块查找失败错误求助
我正在运行pact-js仓库中的消费者示例,已将示例代码修改为JavaScript版本(避免使用TypeScript),代码如下:
import { PactV3, MatchersV3 } from '@pact-foundation/pact'; import path from 'path'; // 创建消费者与提供者之间的契约 const provider = new PactV3({ dir: path.resolve(process.cwd(), 'pacts'), consumer: 'MyConsumer', provider: 'MyProvider', }); // 用于从Dog API获取数据的客户端,是Pact测试的目标 getMeDogs = (from) => { return axios.request({ baseURL: this.url, params: { from }, headers: { Accept: 'application/json' }, method: 'GET', url: '/dogs', }); }; const dogExample = { dog: 1 }; const EXPECTED_BODY = MatchersV3.eachLike(dogExample); describe('GET /dogs', () => { it('返回HTTP 200和狗狗列表', () => { // 准备:设置预期交互 // 使用Pact模拟后端API provider .given('我有一个狗狗列表') .uponReceiving('使用构建器模式请求所有狗狗') .withRequest({ method: 'GET', path: '/dogs', query: { from: 'today' }, headers: { Accept: 'application/json' }, }) .willRespondWith({ status: 200, headers: { 'Content-Type': 'application/json' }, body: EXPECTED_BODY, }); return provider.executeTest( async (mockserver) => { // 执行:测试API客户端行为是否正确 // 注意:动态配置DogService客户端指向Pact创建的mock服务,而非真实服务 dogService = new DogService(mockserver.url); const response = await dogService.getMeDogs('today') // 断言:检查结果 expect(response.data[0]).to.deep.eq(dogExample); }); }); });
我新建目录并执行npm init后,生成的package.json配置如下:
{ "name": "repo1", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "@pact-foundation/pact": "^12.1.1" }, "type": "module" }
环境信息
- Node.js版本:20.10.0
- npm版本:10.2.3
- 操作系统:macOS
- 已全局安装node-gyp
- 已安装gcc
- 已安装make
运行报错
将代码保存为cons.js并运行时,出现以下错误:
[15:38:11.420] ERROR (28229): pact-core@14.0.5: Failed to find native module for darwin-x64: TypeError: Cannot read properties of undefined (reading 'pactffiInitWithLogLevel')
解决思路
重新安装依赖并清理缓存
删除node_modules目录和package-lock.json文件:rm -rf node_modules package-lock.json;清理npm缓存:npm cache clean --force;重新安装依赖:npm install。此操作可修复依赖安装时native模块下载不完整或损坏的问题。检查版本兼容性
Pact-js v12.x与Node.js 20.x可能存在兼容性问题,尝试降级Pact-js到稳定兼容版本(如v11.x):修改package.json中@pact-foundation/pact版本为^11.0.0,再执行npm install。重新构建native模块
进入node_modules/@pact-foundation/pact-core目录,检查是否存在darwin-x64对应的native文件。若缺失,执行npm rebuild @pact-foundation/pact-core --force强制重新构建,确保gcc、make等工具正常运行。匹配系统架构
确认macOS架构是x64还是arm64(M系列芯片):如果是arm64,安装Rosetta 2(softwareupdate --install-rosetta),或强制以x64架构安装依赖:arch -x86_64 npm install。配置测试运行器
当前package.json的test脚本未指定测试框架,Pact测试需要配合Mocha/Jest等运行。修改test脚本为:"scripts": { "test": "mocha cons.js" }同时安装Mocha依赖:
npm install mocha --save-dev
内容的提问来源于stack exchange,提问作者Kalyan Vedala

