У меня появляется сообщение об ошибке из моего промежуточного ПО в моем приложении nodejs.Промежуточное программное обеспечение подтверждает, что пользователь одобрен для получения страницы индекса обсуждений.Когда я запускаю аутентифицированного пользователя, я получаю сообщение об ошибке [ERR_HTTP_HEADERS_SENT]: невозможно установить заголовки после их отправки клиенту.Цикл проверяет студента, но не выходит из цикла и переходит на страницу.Когда я запускаю код с непроверенным учеником, он запускается, как ожидалось, и перенаправляет обратно с сообщением req.session.error.Я получаю эти ошибки для любого маршрута, который я запускаю с подключенным промежуточным программным обеспечением isEnrolled, так что я знаю, что проблема где-то в этом промежуточном программном обеспечении, так как до этого все работало.
Я пробовал код без использования async / await, и он не работал.Затем я переключил его на async / await в цикле forEach, надеясь, что это поможет.Я попытался использовать стандарт для цикла и с различными вариациями с инструкциями if / else.
Ниже мой файл промежуточного программного обеспечения, ошибка должна быть в промежуточном программном обеспечении isEnrolled, которое выделено жирным шрифтом
const middleware = {
asyncErrorHandler: (fn) =>
(req, res, next) => {
Promise.resolve(fn(req, res, next))
.catch(next);
},
**isEnrolled: async (req, res, next) => {**
const course = await Course.findById(req.params.id).populate({
path: 'enrolls',
model: 'Enroll'
});
if (course.enrolls.length) {
course.enrolls.forEach(async enroll => {
if (enroll.status && enroll.student.equals(req.user._id)) {
console.log('status is ', enroll.status);
console.log('student is ', enroll.student);
console.log('user id is ', req.user._id);
await next();
}
});
}
req.session.error = 'Access Denied! You are not currently enrolled.';
res.redirect('back');
},
, а вот маршрут обсуждения
const express = require('express');
const router = express.Router({ mergeParams: true });
const { asyncErrorHandler, isDiscussionAuthor, isLoggedIn, isEnrolled } = require('../middleware');
const {
discussionIndex,
discussionNew,
discussionShow,
discussionCreate,
discussionDestroy
} = require('../controllers/discussions');
router.get('/', isLoggedIn, asyncErrorHandler(isEnrolled), asyncErrorHandler(discussionIndex));
router.get('/new', isLoggedIn, asyncErrorHandler(isEnrolled), asyncErrorHandler(discussionNew));
router.get('/:discussion_id', isLoggedIn, asyncErrorHandler(isEnrolled), asyncErrorHandler(discussionShow));
router.post('/', isLoggedIn, asyncErrorHandler(isEnrolled), asyncErrorHandler(discussionCreate));
router.delete('/:discussion_id', isLoggedIn, asyncErrorHandler(isDiscussionAuthor), asyncErrorHandler(discussionDestroy))
module.exports = router;
Я ожидаю, что это попадет в оператор next () и продолжит движение по маршруту индекса обсуждений, когда пользователь будет подтвержден текущим пользователем, а enroll.status имеет значение true.Вместо этого терминал console.logs в окне показывает, что он проверил пользователя, вместо этого он выдает ошибку и зависает.Ниже мое сообщение об ошибке от терминала
status is 1
student is 5cdcab37c698904044cacd66
user id is 5cdcab37c698904044cacd66
GET /courses/5cdc931f786559570ca3c9a2/discussions 302 51.453 ms - 152
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:470:11)
at ServerResponse.header (C:\Users\colton\upskill\node_modules\express\lib\response.js:767:10)
at ServerResponse.send (C:\Users\colton\upskill\node_modules\express\lib\response.js:170:12)
at done (C:\Users\colton\upskill\node_modules\express\lib\response.js:1004:10)
at C:\Users\colton\upskill\node_modules\ejs-mate\lib\index.js:285:7
at tryHandleCache (C:\Users\colton\upskill\node_modules\ejs-mate\node_modules\ejs\lib\ejs.js:257:5)
at Object.exports.renderFile (C:\Users\colton\upskill\node_modules\ejs-mate\node_modules\ejs\lib\ejs.js:482:10)
at renderFile (C:\Users\colton\upskill\node_modules\ejs-mate\lib\index.js:227:7)
at C:\Users\colton\upskill\node_modules\ejs-mate\lib\index.js:282:7
at tryHandleCache (C:\Users\colton\upskill\node_modules\ejs-mate\node_modules\ejs\lib\ejs.js:257:5)
at Object.exports.renderFile (C:\Users\colton\upskill\node_modules\ejs-mate\node_modules\ejs\lib\ejs.js:482:10)
at View.renderFile [as engine] (C:\Users\colton\upskill\node_modules\ejs-mate\lib\index.js:227:7)
at View.render (C:\Users\colton\upskill\node_modules\express\lib\view.js:135:8)
at tryRender (C:\Users\colton\upskill\node_modules\express\lib\application.js:640:10)
at Function.render (C:\Users\colton\upskill\node_modules\express\lib\application.js:592:3)
at ServerResponse.render (C:\Users\colton\upskill\node_modules\express\lib\response.js:1008:7)
at discussionIndex (C:\Users\colton\upskill\controllers\discussions.js:10:13)
at process._tickCallback (internal/process/next_tick.js:68:7)