express.js Ошибка при перенаправлении сразу после flash () - PullRequest
0 голосов
/ 11 марта 2019

При вызове flash () непосредственно перед перенаправлением я получаю повторяющуюся ошибку.

Код - простая обработка отображения сотрудника:

const express = require('express')
const flash = require('express-flash-notification');
const cookieParser = require('cookie-parser');
const session = require('express-session');    
const app = express()

app.use(cookieParser())
app.use(session({
    secret: 'secretapp',
    resave: false,
    saveUninitialized: true,
    cookie: { secure: true }
  }))
app.use(flash(app))

app.get('/employee/:id*?', (req, res) => {
    console.log('got a request to display');
    if (req.params.id) {
        console.log('got a request to display user ' + req.params.id);
        if (req.params.id==1234) {
            return res.render('employee.hbs', {
                first: "Holy",
                last: "Mitchell"
            });
        } else {
            // *********** I get an error only when flashing:
            req.flash('warning', 'Employee does not exist')
            // *********** No error when commenting out req.flash()
            return res.redirect('/employee/');
        }
    } else {
        return res.render('employee_lookup.hbs');
    }
});

Ошибка выглядит так (я получаю десяткиэта ошибка):

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 (.../addressbook/node_modules/express/lib/response.js:767:10)
    at ServerResponse.location (.../addressbook/node_modules/express/lib/response.js:884:15)
    at ServerResponse.redirect (.../addressbook/node_modules/express/lib/response.js:922:18)
    at app.get (.../addressbook/index.js:37:24)
    at Layer.handle [as handle_request] (.../addressbook/node_modules/express/lib/router/layer.js:95:5)
    at next (.../addressbook/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (.../addressbook/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (.../addressbook/node_modules/express/lib/router/layer.js:95:5)
    at .../addressbook/node_modules/express/lib/router/index.js:281:22

Опять же, чтобы подчеркнуть, без вызова flash () это работает как ожидалось.

1 Ответ

0 голосов
/ 13 марта 2019

Оказывается, что есть несколько вариантов перепрошивки:

"connect-flash": "^0.1.1",
"express-flash-messages": "^0.1.1",
"express-flash-notification": "^0.5.0",
"flash": "^1.1.0",

Я закончил с использованием connect-flash:

app.get('/employee/:id*?', (req, res) => {
    if (req.params.id) {
        console.log('got a request to display user ' + req.params.id);
        if (req.params.id==1234) {                
            return res.render('employee.hbs', {
                first: "Holy",
                last: "Mitchell",
                pic: "https://randomuser.me/api/portraits/women/63.jpg"
            });
        } else {
            req.flash('info', `Employee not found`);
            return res.redirect('/employee/');
        }
    } else {
        return res.render('employee_lookup.hbs', { messages: req.flash('info') });
    }
});

... и это прекрасно работает.

Я также узнал, что мне нужно явно передать флеш как параметр в шаблон.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...