javascript - 错误 [ERR_HTTP_HEADERS_SENT]:无法在将标头发送到客户端后设置标头,我无法将表单发送到实时数据库
问题描述
- 这是我的 html 代码提交
<form action="/user/product/add" method="POST" enctype="multipart/form-data" >
<h1 class="h">Add Product</h1>
<div>
<table class="tableez" cellpadding="4" cellspacing="0" style="width:400px">
<tr>
<div class="form-group">
<input type="file" name="imageProduct" multiple>
</div>
</tr>
<tr>
<td class="tdtitle">Tên sản phẩm: </td>
<td><input type="text" value="{{data.nameProduct}}" name="nameProduct"
id="nameProduct">
</td>
</tr>
<button type="submit" class="btn btn-primary">Thêm</button>
</form>
- 这是我的 api
router.post('/product/add', upload.array('imageProduct', 5), isLoggedIn, function (req, res, next) {
var idd = "5ea4528ccaf1ab0017e0fe22";
var filesImage = req.files;
var images = [];
filesImage.forEach(function (item, index, array) {
images.unshift(item.filename);
});
var winner = [];
winner.unshift("1");
winner.unshift("Chưa có");
// var messages = [];
// messages.unshift({
// a : "qwe",
// b : "asdq"
// });
var played = [];
played.unshift("null");
var registerDatee = Date.now();
var time = req.body.time;
console.log(time);
const product = {
imageProduct: images,
nameProduct: req.body.nameProduct,
userId: idd,
nameProductType: req.body.cars,
startPriceProduct: req.body.currentPrice,
status: req.body.status,
description: req.body.description,
extraTime: req.body.time,
registerDate: registerDatee,
winner: winner,
hide: false,
currentPrice: req.body.currentPrice,
played: played
};
var db = Firebase.database();
var rootRef = db.ref('products');
rootRef.push(product);
res.redirect('/');
});
单击提交后,出现以下错误 3. 这是我的错误
POST /user/product/add 200 151.592 ms - -
_http_outgoing.js:526
throw new ERR_HTTP_HEADERS_SENT('set');
^
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:526:11)
at ServerResponse.header (C:\Users\HaAnh\Desktop\api\backend-app-daugia\node_modules\express\lib\response.js:767:10)
at ServerResponse.contentType (C:\Users\HaAnh\Desktop\api\backend-app-daugia\node_modules\express\lib\response.js:595:15)
at ServerResponse.send (C:\Users\HaAnh\Desktop\api\backend-app-daugia\node_modules\express\lib\response.js:145:14)
at done (C:\Users\HaAnh\Desktop\api\backend-app-daugia\node_modules\express\lib\response.js:1004:10)
at Immediate._onImmediate (C:\Users\HaAnh\Desktop\api\backend-app-daugia\node_modules\express-handlebars\lib\utils.js:26:4)
at processImmediate (internal/timers.js:456:21) {
code: 'ERR_HTTP_HEADERS_SENT'
}
[nodemon] app crashed - waiting for file changes before starting...
不明白为什么我提交后就报错了,但是改掉就好了,上面的问题看了很多,但是我的项目还是没有解决办法。我哭了,因为我不知道下一步该做什么。 尽管发生了错误,但该产品已保存在数据库中。 请给我一个解决方案,以便我可以继续我的项目!
解决方案
这看起来是 Node.js 中非阻塞 I/O 的一个经典问题。你需要将你的工作包装在一个 Promise 中。
new Promise(function(resolve, reject) {
//do the file work
var idd = "5ea4528ccaf1ab0017e0fe22";
var filesImage = req.files;
var images = [];
filesImage.forEach(function (item, index, array) {
images.unshift(item.filename);
});
// more work here
return true; //after the work is done
})
.then(() => {
// do more work here if needed
});
.then(() => {
// after the I/O work is done
res.redirect('/');
});
我没有仔细检查语法,但你可以从我的片段中得到这个想法。
推荐阅读
- c# - 如何使用 NetworkStream.WriteAsync 取消等待?
- regex - Git:仅提交指定的文件(重命名、删除、修改、新文件等)
- stock - Alpha Vantage API 不适用于巴西股票
- python - Python - 使用 sys.exit() 启动一个线程会杀死所有线程
- typescript - 打字稿魔法属性
- google-cloud-firestore - 带有gps距离的firestore权限
- javascript - 将一维数组中的项目配对为多维数组的最简单的普通 JavaScript 方法?
- python-3.x - 当模型包含张量操作时,Pytorch DataParallel 不起作用
- asp.net-core-3.1 - 无法将 TagBuilder InnerHtml 属性设置为某个值?
- flutter - 如何在 Flutter 中更改 iOS 键盘上输入操作按钮的颜色?