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”实体方法放在哪里?

如何从laravel route post将数据保存到mysql数据库中

Mocha 未显示 chai 错误消息

为啥图像没有使用 POST 保存在服务器中?

Java面试题:POST请求与GET请求的区别在哪?