Heroku通过POST请求一次又一次崩溃,Multer或nodemailer H=18 [英] Heroku crash over and over by POST request, multer or nodemailer H=18
本文介绍了Heroku通过POST请求一次又一次崩溃,Multer或nodemailer H=18的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
Router.js
const express = require("express");
const mongoose = require("mongoose");
const router = express.Router();
const multer = require("multer");
const path = require("path");
const File = require("../models/Files");
const mail = require("../handlers/mailer");
// Set storage engine
const storage = multer.memoryStorage();
// Init upload
const upload = multer({
storage: storage
}).single("file");
router.get("/", (req, res) => {
res.render("index");
});
router.post("/send", async (req, res, next) => {
await upload(req, res, async err => {
if (err) {
console.log("error by uploading file:", err);
} else {
console.log(`File is uploaded to the memoryStorage: ${req.file.originalname} `);
}
// Create a model to save in the database
const fileUpload = new File({
fromEmail: "<dk@bigbrother.nl>",
fromName: '"Dennis Klarenbeek 👻"',
email: req.body.email,
subject: req.body.subject,
msg: req.body.msg,
filename: req.file.originalname
});
await fileUpload.save((err, file, rows) => {
if (err) {
console.log("error on saving in the db");
} else {
console.log(`database item has been created: ${file.filename}`);
}
});
// Mail the uploaded attachment
await mail.send({
fromEmail: "dennis.klarenbeek@icloud.com",
fromName: '"Dennis Klarenbeek 👻"',
toEmail: req.body.email,
toName: req.body.name,
subject: req.body.subject,
msg: req.body.msg,
template: "attachment",
attachments: [
{
filename: req.file.filename,
contentType: req.file.mimetype,
content: req.file.buffer
}
]
});
});
res.redirect("/");
});
module.exports = router;
日志
2018-07-12T15:29:46.104415+00:00 heroku[router]: at=info method=GET path="/css/style.css" host=stormy-ocean-50061.herokuapp.com request_id=57113d1c-9730-40ca-9f41-0d5111854175 fwd="87.251.40.140" dyno=web.1 connect=1ms service=10ms status=304 bytes=237 protocol=https
2018-07-12T15:29:46.103429+00:00 heroku[router]: at=info method=GET path="/css/normalize.css" host=stormy-ocean-50061.herokuapp.com request_id=44a0f90b-1973-4daf-9f40-1e5e5398b9e4 fwd="87.251.40.140" dyno=web.1 connect=1ms service=7ms status=304 bytes=238 protocol=https
2018-07-12T15:29:46.487118+00:00 app[web.1]: [0mGET /webfonts/fa-light-300.woff2 [36m304 [0m0.353 ms - -[0m
2018-07-12T15:29:46.489183+00:00 heroku[router]: at=info method=GET path="/webfonts/fa-light-300.woff2" host=stormy-ocean-50061.herokuapp.com request_id=885eae11-3e4c-4efa-9b60-b3950d9f256d fwd="87.251.40.140" dyno=web.1 connect=1ms service=2ms status=304 bytes=239 protocol=https
2018-07-12T15:29:56.919861+00:00 app[web.1]: [0mPOST /send [36m302 [0m9.041 ms - 46[0m
2018-07-12T15:29:57.100559+00:00 heroku[router]: sock=backend at=error code=H18 desc="Server Request Interrupted" method=POST path="/send" host=stormy-ocean-50061.herokuapp.com request_id=aaafb074-b538-4983-bef1-fa1abf1f2413 fwd="87.251.40.140" dyno=web.1 connect=1ms service=191ms status=503 bytes=234 protocol=https
有人知道这可能是什么吗?
推荐答案
当套接字在响应完成之前销毁时引发HerokuH18错误。从Heroku文档中它写道:
通常,H18表示响应有多个阶段-对于 实例,流传输大响应块--其中之一 Stages引发错误。";
我们可以执行一些步骤来重构代码,以便使用Multer作为中间件,并改进错误处理,以便我们可以看到错误实际发生的位置。
要在解析等待时捕获抛出的错误,您需要将其包装在try...catch
块中。它的工作原理与Promise.Catch完全相同。
const express = require("express");
const mongoose = require("mongoose");
const router = express.Router();
const multer = require("multer");
const path = require("path");
const File = require("../models/Files");
const mail = require("../handlers/mailer");
// Set storage engine
const storage = multer.memoryStorage();
// Init upload
const upload = multer({
storage: storage
}).single("file");
router.get("/", (req, res) => {
res.render("index");
});
router.post("/send", async (req, res, next) => {
// No need to await this middleware
upload(req, res, err => {
// Refactor to using recommended multer error handling
// https://github.com/expressjs/multer#error-handling
if (err instanceof multer.MulterError) {
// A Multer error occurred when uploading.
console.log("multer error when uploading file:", err);
return res.sendStatus(500);
} else if (err) {
// An unknown error occurred when uploading.
console.log("unknown error when uploading file:", err);
return res.sendStatus(500);
}
console.log(`File is uploaded to the memoryStorage: ${req.file.originalname} `);
// Create a model to save in the database
const fileUpload = new File({
fromEmail: "<dk@bigbrother.nl>",
fromName: '"Dennis Klarenbeek 👻"',
email: req.body.email,
subject: req.body.subject,
msg: req.body.msg,
filename: req.file.originalname
});
// Try executing awaits or catch thrown errors
try {
await fileUpload.save((err, file, rows) => {
if (err) {
console.log("error on saving in the db");
} else {
console.log(`database item has been created: ${file.filename}`);
}
});
// Mail the uploaded attachment
await mail.send({
fromEmail: "dennis.klarenbeek@icloud.com",
fromName: '"Dennis Klarenbeek 👻"',
toEmail: req.body.email,
toName: req.body.name,
subject: req.body.subject,
msg: req.body.msg,
template: "attachment",
attachments: [
{
filename: req.file.filename,
contentType: req.file.mimetype,
content: req.file.buffer
}
]
});
// Return res here to signify end of function execution
return res.redirect("/");
} catch (err) {
console.log('Error occured in saving to DB or with mail send ', err);
return res.sendStatus(500);
}
});
});
module.exports = router;
这应该允许您查看正在发生的实际错误。当然,您也可以在响应中发回错误,现在我只是发送一个状态500来完成响应。
这篇关于Heroku通过POST请求一次又一次崩溃,Multer或nodemailer H=18的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文