Как исправить ошибку [ERR_HTTP_HEADERS_SENT] в Nodejs и экспресс-приложении? - PullRequest
0 голосов
/ 16 мая 2019

У меня появляется сообщение об ошибке из моего промежуточного ПО в моем приложении 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)
...