Довольно новый для 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();
}));
Первоначально я думал, что это тот факт, что мой вызов базы данных не был настроен как неблокирующий, но даже после этого поведение сохраняется. Что мне здесь не хватает?