公约退出代码1

我试图用Pact库执行一些testing,我得到一些错误。 这里是testingconfiguration:

 const path = require('path'); const Pact = require('pact'); const expect = require('expect.js'); const config = require('../../../src/server/config'); const service = require('../../../src/routes/interactions/interactions.service'); describe('@component/interactions tests', () => { const url = 'http://localhost'; const port = 8989; const provider = Pact({ port: port, log: path.resolve(process.cwd(), 'test/component/interactions/log/interactions-pact.log'), dir: path.resolve(process.cwd(), 'test/component/interactions/pacts'), spec: 2, consumer: 'cx_issue', provider: 'interaction', // logLevel: 'WARN' }); config.settingsToExport.INTERACTION_URL = `${url}:${port}`; before(done => { provider.setup() .then(() => { done(); }) .catch(err => { done(err); }); }); after(done => { provider.finalize() .then(() => { done(); }) .catch(err => { done(err); }); }); describe('#createInteraction', () => { before(done => { const INTERACTION_BODY = { contact: 'contact1' }; const TERM = { generate: '0dae5b93-9451-4b08-b7bb-f0b944fbcdf2', matcher: '^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$' }; const pactInteractionCreate = { state: 'Creates a new interaction', uponReceiving: 'a new interaction is created successfully', withRequest: { method: 'POST', path: '/interactions', body: INTERACTION_BODY }, willRespondWith: { status: 201, body: { id: Pact.Matchers.term(TERM) } } }; const promises = [ provider.addInteraction(pactInteractionCreate) ]; Promise.all(promises) .then(() => { done(); }); }); it('/api/interactions POST', done => { const interaction = { contact: 'The xx' }; service.createInteraction(interaction) .then(response => { expect(response.id).to.be.equal(TERM.generate); done(); }) .catch(done); }); }); }); 

这是我的package.json文件内容,已经安装了所有依赖关系:

 { "name": "issueAPI", "version": "1.0.0", "private": true, "main": "./src/index.js", "scripts": { "dev": "nodemon -e js ./src/index.js", "start": "node ./src/index.js", "linter": "node ./node_modules/eslint/bin/eslint.js ./src", "test": "mocha test", "test-component": "mocha test/component", "install-test-build": "npm install && npm test && npm run linter", "test-build": "npm test && npm run linter" }, "jshintConfig": { "esversion": 6 }, "dependencies": { "ajv": "^4.11.3", "body-parser": "^1.17.2", "express": "^4.15.3", "express-winston": "^2.4.0", "request": "^2.81.0", "winston": "^2.3.1", "yamljs": "^0.2.9" }, "devDependencies": { "@pact-foundation/pact-node": "^4.8.3", "dotenv": "^4.0.0", "eslint": "^4.2.0", "eslint-config-node": "^1.6.0", "expect.js": "^0.3.1", "mocha": "^3.2.0", "nodemon": "^1.11.0", "pact": "^2.3.3", "sinon": "^2.3.8", "supertest": "^3.0.0" } } 

这是我得到的错误: 在这里输入图像说明

基本上,现在如果testing结果不好,我根本不介意。 现在的主要问题是协议模拟服务器没有启动。

这里奇怪的是我有其他项目,协议testing运行正常。 我把我想testing的服务从那个不能执行那些testing的项目中移出来,并且正在工作(至less启动了协议模拟服务器)。 这个其他项目中的依赖关系几乎与问题项目相同:

 "dependencies": { "ajv": "^4.11.3", "body-parser": "^1.16.1", "dotenv": "^4.0.0", "express": "^4.14.0", "jsonwebtoken": "^7.4.1", "jwt-simple": "^0.5.1", "morgan": "^1.8.1", "mustache-express": "^1.2.4", "node-env-file": "^0.1.8", "request": "^2.79.0", "when": "^3.7.8" }, "devDependencies": { "@pact-foundation/pact-node": "^4.8.3", "eslint": "^3.17.1", "eslint-config-node": "^1.6.0", "expect.js": "^0.3.1", "mocha": "^3.2.0", "nodemon": "^1.11.0", "pact": "^2.3.3", "sinon": "^1.17.7", "supertest": "^3.0.0", "nock": "^9.0.13" } 

这种情况发生了什么?

编辑:我已经启动与DEBUG标志的pacttesting,这是生成的日志: 在这里输入图像说明 在这里输入图像说明

看起来服务器无法正确启动,以1的退出码来判断。这可能是端口8989上的端口冲突,所以值得检查。

它可能与https://github.com/pact-foundation/pact-js/issues/64(Windows文件path长度有限)有关。

你能否使用logLevel: 'DEBUG'启用DEBUG日志logginglogLevel: 'DEBUG'并记下它输出的内容,并共享任何*.log文件。 这可能是一个参数启动服务器时没有正确格式化。

正如你所看到的,它不能启动底层的Ruby进程,所以我们需要深入到底层。

在我看来,服务器启动不正常,这通常是因为该端口已被使用。 要查看是否属于这种情况,请在您的节点命令行(在cmd中键入node以转到节点命令行)复制/粘贴以下内容:

 require('http').createServer(function(){}).listen(11108); 

“听”function需要端口号,我从你的屏幕截图。 看看哪个节点输出; 我的猜测是会显示这样的事情:

 Error: listen EADDRINUSE :::11108 at Object.exports._errnoException (util.js:1018:11) at exports._exceptionWithHostPort (util.js:1041:20) at Server._listen2 (net.js:1258:14) at listen (net.js:1294:10) at Server.listen (net.js:1390:5) at repl:1:44 at sigintHandlersWrap (vm.js:22:35) at sigintHandlersWrap (vm.js:73:12) at ContextifyScript.Script.runInThisContext (vm.js:21:12) at REPLServer.defaultEval (repl.js:340:29) 

这意味着实际上存在港口冲突。 看看你的任务pipe理器,并确保没有任何节点在后台运行,可能会干扰你的testing,启动一个新的服务器。 您可能还想检查任何版本的ruby.exe正在运行; 不幸的是,我们必须将ruby.exe与pact-node一起打包,然后使用ruby转换模拟服务器的一个新实例,因为这是它所写入的语言。偶尔发生的情况是,节点简单地“失去跟踪“的ruby实例,并没有正确closures它。

这是我们所熟知的问题,也是我们正在积极尝试解决的问题,将所有核心协议代码整合到一个共享库中,可以在所有语言和操作系统上使用,而无需启动额外的实例。 请忍受我们,因为我们得到一些这些扭结:)

最后,在@Matthew研究员回答并阅读了https://github.com/pact-foundation/pact-js/issues/64的链接之后,我将项目移到了较短的path位置,类似于D:\myproject\ ,然后启动pact模拟服务器,并通过了我的testing。 因此,直到find更好的解决scheme,我将在该短path目录下工作,以避免更多的问题。

请阅读以前的链接,以获得有关此错误的更多信息,因为有很好的解释。