TLDR: Мой API хорошо работает с curl и почтальоном, но не проходит тестирование с ошибкой «Невозможно установить заголовки после их отправки клиенту» при использовании chai-http в одном запросе put (все другие запросы put работают).У меня есть общий метод обновления для всех моих коллекций (прилагается ниже), который работает для других запросов обновления / размещения.Спасибо за вашу помощь в продвинутом.
Mocha & Chai Test для коллекции клиентов
process.env.NODE_ENV = 'test';
const chai = require('chai');
const chaiHttp = require('chai-http');
const expect = chai.expect;
const c_paths = require('../constants/paths.js');
const app = require('../app.js');
chai.use(chaiHttp);
describe(c_paths.clients, () => {
it('It should create a new clients document', done => {
let req = {
test: true,
data: [
{
name: 'client 1',
contacts: [
{
name: 'client name 1',
mobile: 'client mobile 1',
email: 'client1@email.com',
},
],
address: ['client address 1'],
},
],
};
chai
.request(app)
.post(c_paths.clients)
.send(req)
.end((err, res) => {
expect(res).to.have.status(200);
expect(res.body.insertedCount).is.equal(
1,
'Number of inserted documents.',
);
expect(res.body.ops[0].name).is.equal(req.data[0].name);
expect(res.body.ops[0].contacts[0].name).is.equal(
req.data[0].contacts[0].name,
);
expect(res.body.ops[0].contacts[0].mobile).is.equal(
req.data[0].contacts[0].mobile,
);
expect(res.body.ops[0].contacts[0].email).is.equal(
req.data[0].contacts[0].email,
);
expect(res.body.ops[0].address[0]).is.equal(req.data[0].address[0]);
expect(res.body.ops[0].pause_updates).is.false;
expect(res.body.ops[0].pause_updates_toggle).is.false;
done();
});
});
it.('It should add a reccuring job', done => {
let req = {
test: true,
filter: {
name: 'client 1',
},
set: {
recurring_jobs: [
{
job_id: 'job id 1',
current_employee_id: 'employee id 1',
employee_scheduled_till: 'Apr 30 2019',
notes: ['note 1'],
duties: ['duty 1'],
repeat_in_days: 7,
time: '11:00:00', // Validation error switched to 10000
start_date: 'Mar 01 2019',
end_date: 'May 30 2019',
is_active: true,
},
],
},
};
chai
.request(app)
.put(c_paths.clients)
.send(req)
.end((err, res) => {
expect(res).to.have.status(200);
expect(res.body.ok).is.equal(1);
done();
});
});
it('It should delete one document', done => {
let req = {
test: true,
filter: {
name: 'client 1',
},
};
chai
.request(app)
.delete(c_paths.clients)
.send(req)
.end((err, res) => {
expect(res).to.have.status(200);
expect(res.body.n).is.equal(1, 'Number of documents removed');
done();
});
});
});
Метод обновления в ./routes/crud.js.Ошибка в строке 131: res.status (200) отправить (результат);
function update(req, res, dbName, collectionName, joiSchema) {
var toValidate = '[';
var data = '{';
if (req.body.set) {
toValidate = toValidate.concat(JSON.stringify(req.body.set), ',');
data = data.concat('"$set":', JSON.stringify(req.body.set), ',');
}
if (req.body.inc) {
toValidate = toValidate.concat(JSON.stringify(req.body.inc), ',');
data = data.concat('"$inc":', JSON.stringify(req.body.inc), ',');
}
if (req.body.addToSet) {
let temp = JSON.stringify(req.body.addToSet);
temp = temp.replace('{"$each":[', '[');
temp = temp.slice(0, -1); // Removes $each for validation
toValidate = toValidate.concat(temp, ',');
data = data.concat('"$addToSet":', JSON.stringify(req.body.addToSet), ',');
}
if (req.body.unset) {
data = data.concat('"$unset":', JSON.stringify(req.body.unset), ',');
}
if (req.body.currentDate) {
toValidate = toValidate.concat(JSON.stringify(req.body.currentDate), ',');
data = data.concat(
'"$currentDate":',
JSON.stringify(req.body.currentDate),
',',
);
}
if (req.body.rename) {
data = data.concat('"$rename":', JSON.stringify(req.body.rename), ',');
}
if (req.body.pullAll) {
toValidate = toValidate.concat(JSON.stringify(req.body.pullAll), ',');
data = data.concat('"$pullAll":', JSON.stringify(req.body.pullAll), ',');
}
toValidate = toValidate.slice(0, -1); // Removes trailing comma
data = data.slice(0, -1);
toValidate = toValidate.concat(']');
data = data.concat('}');
Joi.validate(toValidate, joiSchema, function(err, value) {
if (err) {
res.send(err);
return;
}
});
MongoClient.connect(c_db.url, function(err, db) {
if (err) {
res.send(err);
db.close();
return;
}
const dbo = db.db(dbName);
const filter = req.body.filter == null ? '' : req.body.filter;
dbo
.collection(collectionName)
.updateMany(filter, JSON.parse(data), function(err, result) {
if (err) {
res.send(err);
db.close();
return;
}
res.status(200).send(result); //Error Line 131
db.close();
});
});
};
Ошибка ответа
Ошибка [ERR_HTTP_HEADERS_SENT]: невозможно установить заголовки после того, как ониотправляются клиенту по адресу ServerResponse.setHeader (_http_outgoing.js: 482: 11) по адресу ServerResponse.header (./App/node_modules/express/lib/response.js:767:10) по адресу ServerResponse.send (./App/node_modules / express / lib / response.js: 170: 12) в ServerResponse.json (./App/node_modules/express/lib/response.js:267:15) в ServerResponse.send (./App/node_modules/express/lib / response.js: 158: 21) в ./App/routes/crud.js:131:25 в результате (./App/node_modules/mongodb/lib/utils.js:414:17) в session.endSession (./App/node_modules/mongodb/lib/utils.js:401:11) в ClientSession.endSession (./App/node_modules/mongodb-core/lib/sessions.js:129:41) в executeCallback (./App/node_modules / mongodb / lib / utils.js: 397: 17)