Приложение Express Web App сгенерировало 500 ошибок при повторной отправке - PullRequest
0 голосов
/ 12 мая 2018

Довольно новый для Express и Nodejs в целом, и я только что создал очень простое приложение, которое работает точно так же, как и ожидалось при первой отправке, но при перезагрузке корневой страницы и повторной отправке выдает ошибку 500, как показано в журнале отладки:

GET / 304 2230.094 ms - -
GET /stylesheets/main.css 304 10.464 ms - -
GET /success? 200 4309.006 ms - 303
GET /stylesheets/main.css 304 2.027 ms - -
Error: Can't set headers after they are sent.
    at validateHeader (_http_outgoing.js:491:11)
    at ServerResponse.setHeader (_http_outgoing.js:498:3)
    at ServerResponse.header (C:\Users\Hayden\source\repos\fieldops\FieldOps\node_modules\express\lib\response.js:767:10)
    at ServerResponse.send (C:\Users\Hayden\source\repos\fieldops\FieldOps\node_modules\express\lib\response.js:170:12)
    at done (C:\Users\Hayden\source\repos\fieldops\FieldOps\node_modules\express\lib\response.js:1004:10)
    at Object.exports.renderFile (C:\Users\Hayden\source\repos\fieldops\FieldOps\node_modules\pug\lib\index.js:421:12)
    at View.exports.__express [as engine] (C:\Users\Hayden\source\repos\fieldops\FieldOps\node_modules\pug\lib\index.js:464:11)
    at View.render (C:\Users\Hayden\source\repos\fieldops\FieldOps\node_modules\express\lib\view.js:135:8)
    at tryRender (C:\Users\Hayden\source\repos\fieldops\FieldOps\node_modules\express\lib\application.js:640:10)
    at Function.render (C:\Users\Hayden\source\repos\fieldops\FieldOps\node_modules\express\lib\application.js:592:3)
**GET /success? 500 128.822 ms - 150**
GET /stylesheets/main.css 304 0.843 ms - -

Такое поведение сохраняется как в моей среде разработки, так и в контейнерной версии приложения. Перезапуск сервера в обоих случаях разрешает это, что заставляет меня поверить, что я не завершаю поток правильно. Это преимущественно обрабатывается одним маршрутом и частью промежуточного программного обеспечения:

router.get('/', asyncHandler(async (req, res, next) => {
    const newEnv = await skytap.environments.create({ template_id: 1334141 });
    var environments = await skytapV2.environments.list(newEnv);
    skytap.environments.update({ configuration_id: newEnv.id, name: 'New Test Space' }, next);
    skytap.environments.start({ configuration_id: newEnv.id }, next);
    envID = newEnv.id;
    res.render('success', { title: 'Success!', env: newEnv.id, erl: newEnv.url });

    next();
}));

/* POST Schedule */
router.use(asyncHandler(async (req, res, next) => {
    var isRunning = await skytap.environments.waitForState({ configuration_id: envID, runstate: 'running' }, next);
    var dt = datetime.create();
    var formatTime = dt.format('Y/m/d H:M');
    dt.offsetInHours(1);
    var formatOffsetTime = dt.format('Y/m/d H:M');       
    var postData = {
        title: "Killer Schedule",
        configuration_id: envID,
        actions: [
            {
                type: "shut down",
                offset: "3600"
            }
        ],
        start_at: formatTime,
        time_zone: "UTC",
        end_at: formatOffsetTime,
        time_zone: "UTC",
        delete_at_end: true
    };
    var options = {
        url: 'https://cloud.skytap.com/schedules.json',
        method: 'POST',
        headers: {
            'content-type': 'application/json',
            'Authorization': 'Basic *auth key*'
        },
        body: postData,
        json:true
    };
    request(options, function (err, res, body) {
        if (err) {
            console.error('error posting json: ', err)
            throw err
        }
        var headers = res.headers
        var statusCode = res.statusCode
        console.log('headers: ', headers)
        console.log('statusCode: ', statusCode)
        console.log('body: ', body)
    });
    next();
}));

Первоначально я думал, что это тот факт, что мой вызов базы данных не был настроен как неблокирующий, но даже после этого поведение сохраняется. Что мне здесь не хватает?

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