gpt4 book ai didi

node.js - Chai Http 帖子 : save entity to mongodb Error: read ECONNRESET

转载 作者:太空宇宙 更新时间:2023-11-03 23:59:55 25 4
gpt4 key购买 nike

我正在为将实体保存到 mongodb 的路由编写测试。该路由在使用 postman 时工作正常,但在运行 chai http 测试时失败。

抛出的错误是:

Error: read ECONNRESET

或者有时:

Error: socket hang up.

我不明白我做错了什么,如果有人可以帮助我或为我指明方向,我将非常感激。干杯

服务器文件:

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 object 是一个遵循 mongoose schema 的虚拟 json 对象。

app对象引用 Express 服务器实例。

测试的路线('saveData/savePharmacie')是上面描述的路线(router.post)。

最佳答案

您的第一个问题是由 app.listen 函数引起的:这是一个异步函数,因此当您导入主服务器文件时,您无法确定它正在运行。

然后,chai http lib文档说:

You may use a function (such as an express or connect app) or a node.js http(s) server as the foundation for your request. If the server is not running, chai-http will find a suitable port to listen on for a given test.

所以,我建议您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 文件。

关于node.js - Chai Http 帖子 : save entity to mongodb Error: read ECONNRESET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55267258/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com