繁体   English   中英

异步代码设计错误。 UnhandledPromiseRejectionWarning:错误 [ERR_HTTP_HEADERS_SENT],

[英]Error with async code design. UnhandledPromiseRejectionWarning: Error [ERR_HTTP_HEADERS_SENT],

我在使用 node/express 时遇到错误。 我假设问题出在我的异步代码设计上。

Output:容器成功

预期 Output:容器成功.. 上传成功...

错误:(节点:18364)UnhandledPromiseRejectionWarning:错误[ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后无法设置

UnhandledPromiseRejectionWarning:未处理的 promise 拒绝。 此错误源于在没有 catch 块的情况下抛出异步 function,或者拒绝未使用 .catch() 处理的 promise

弃用警告:未处理的 promise 拒绝已弃用。 以后,未处理的 promise 拒绝将以非零退出代码终止 Node.js 进程。

代码:

const express = require("express");
const multer = require("multer");
const AuthReq = require("../middleWare/AuthReq");
require("dotenv").config();
const Azure_Storage_Connection_String = process.env.Azure_Connection_String;
const { BlobServiceClient } = require("@azure/storage-blob");

const Router = express.Router();

const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, "uploads");
  },
  filename: function (req, file, cb) {
    cb(null, Date.now() + "-" + file.originalname);
  },
});

const upload = multer({ storage: storage });

Router.post("/profile", AuthReq, upload.single("profile"), async (req, res) => {
  const file = req.file;

  const blobServiceClient = BlobServiceClient.fromConnectionString(
    Azure_Storage_Connection_String
  );

  const containerName = req.user._id;

  const ContainerClient = blobServiceClient.getContainerClient(containerName);

  try {
    const containerResponse = await ContainerClient.create();
  } catch (err) {
    return res.status(400).send("Error while sending image");
  }

  res.send("Success in container");

  const contentType = file.mimetype;

  const filePath = file.path;

  const blobName = file.filename + contentType;

  const blockBlobClient = ContainerClient.getBlockBlobClient(blobName);

  try {
    const uploadBlobResponse = await blockBlobClient.uploadFile(filePath);
  } catch (err) {
    return res.status(400).send("Error while sending image");
  }

  res.send("Success in Uploading...");
});

module.exports = Router;

每个请求不能多次使用res.send ,因为一个请求只有一个响应。 我假设您想发送一个“两部分”响应,以便用户首先看到“容器中成功”,然后(几秒钟后)“上传成功...”。

如果您使用 Node.js 将以两个“块”发送响应

res.write("Success in container");
...
res.end("Success in Uploading...");

(另请参阅此答案中的解释。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM