Chai Http Post:将实体保存到 mongodb 错误:读取 ECONNRESET
Posted
技术标签:
【中文标题】Chai Http Post:将实体保存到 mongodb 错误:读取 ECONNRESET【英文标题】:Chai Http Post : save entity to mongodb Error: read ECONNRESET 【发布时间】:2019-08-11 12:43:44 【问题描述】:我正在为将实体保存到 mongodb 的路由编写测试。 该路由在使用 postman 时运行良好,但在运行 chai http 测试时失败。
抛出的错误是:
错误:读取 ECONNRESET
或者有时:
错误:套接字挂起。
我不明白自己做错了什么,如果有人可以帮助我或为我指明方向,我将不胜感激。 干杯
服务器文件:
const express = require('express');
const database = require('./controller/databaseController');
const router = require('./routes/router');
const bodyParser = require('body-parser');
const app = express();
const port = 3000;
app.use(bodyParser.json());
app.use("/", router);
database.connect();
app.listen(port, () =>
console.log( "serveur launched, listening on port " + port );
console.log("environment : " + app.settings.env);
);
//export app for testing purpose
module.exports = app;
路线代码:
router.post('/savePharmacie', (req, res) =>
var pharmacie = new PharmacieModel(req.body);
pharmacie.save((err, doc) =>
if(err)
res.writeHead(500, "Content-Type": "application/json");
res.json(err);
res.end();
else
res.writeHead(200, "Content-Type": "application/json");
res.json(doc);
res.end();
);
);
测试代码:
describe('save to database', () =>
it('save one to database', (done) =>
chai.request(app)
.post('saveData/savePharmacie')
.send(pharmacieMockup)
.end((err, resp, body) =>
if(err)
console.log("error : " + err);
done(err);
else
var response = res.body;
console.log("response : " + response);
var expected = [pharmacieMockup];
response.should.be.a('array');
expect(response[0]).to.deep.include(expected[0]);
done();
);
);
after((done) =>
PharmacieModel.deleteMany();
done();
);
);
pharmacieMockup
对象是一个遵循 mongoose 模式的虚拟 json 对象。
app
对象引用了一个快速服务器实例。
测试的路由('saveData/savePharmacie')是上面描述的路由(router.post)。
【问题讨论】:
请提供有关您的测试设置的更多信息。应用程序对象来自哪里?您的测试是通过虚假的应用对象还是真实的 http 请求? @lifeisfoo :感谢您的评论,我添加了更多信息。 app 对象是一个 express 服务器实例,测试通过一个真正的 http 请求,处理这个 http 请求的代码是 Routes 下面的代码 你是如何从你的主 js 文件中导出你的应用程序的?你如何启动/绑定你的服务器(代码如.listen()
)?
@lifeisfoo 我添加了整个 server.js 文件,是的,我使用 app.listen(portNbr) 和 module.exports = app 从我的 test.js 文件中访问应用程序
【参考方案1】:
您的第一个问题是由 app.listen
函数引起的:这是一个异步函数,因此当您导入主服务器文件时,您无法确定它是否正在运行。
然后,chai http lib 文档说:
您可以使用函数(例如 express 或 connect 应用程序)或 node.js http(s) 服务器作为请求的基础。如果服务器没有运行,chai-http 会找到一个合适的端口来监听给定的测试。
所以,我建议你 separate your express app and server 使用两个文件:这样你就可以在你的测试中导入你的 express 应用,而无需处理外部异步函数。
这是建议结构的一个最小示例:
文件app.js
:
const app = express();
app.get('/', function(req, res)
res.status(200);
);
module.exports = app
文件bin/app
(没有扩展名的文件):
#!/usr/bin/env node
// the above line is required if you want to make it directly executable
// to achieve this you need to make it executable using "chmod +x bin/app" from you shell, but it's an optional only required if you want to run it using "./bin/app" without an npm script.
var app = require('../app');
var http = require('http');
app.set('port', process.env.PORT || '3000');
var server = http.createServer(app);
然后使用新的运行脚本更新您的 package.json 文件:
"scripts":
//...
"start-app": "node ./bin/app",
现在您可以使用npm run start-app
运行您的应用程序。您的测试代码应该保持不变,只导入带有require
命令的app.js
文件。
【讨论】:
感谢您的帮助,我从未见过 bin/app 之类的文件,尤其是“#!/usr/bin/env 节点”。文件的扩展名应该是什么? 我刚试了一下,效果很好。非常感谢您的帮助和最佳实践以上是关于Chai Http Post:将实体保存到 mongodb 错误:读取 ECONNRESET的主要内容,如果未能解决你的问题,请参考以下文章
处理HTTP Post的正确方法,然后通过HTTP下载,然后保存到核心数据
Symfony2:将“pre-set”和“post-get”实体方法放在哪里?