node.js - Express Web App 在第二次提交时抛出 500 错误
问题描述
总的来说,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();
}));
最初我认为这是我的数据库调用没有设置为非阻塞的事实,但即使删除了,行为仍然存在。我在这里想念什么?
解决方案
推荐阅读
- android - 如何强制 Google 重新获取 .well-known/assetlinks.json 以修复我的 Android App Link 实现
- python - 具有不同参数的 Python 函数指针
- botframework - 在对话状态属性中存储数据与对话的上下文序列化之间有什么区别
- android - 无法在 Google Cloud Platform(Windows 操作系统)上使用 Android Studio 检测到三星 S9 设备
- jquery - 如何在jquery中使用多个输入字段类名进行验证
- c# - SharePoint 2016 FileNotFound 异常
- ajax - 使用ajax的控制器方法调用
- c# - CRM v9 - 通过 C# 代码将数据保存在 CRM 实体中
- google-cloud-platform - 超过 tabledata.list 每秒字节数的配额
- json - 从 Redshift 中的 JSON 字段中提取数据