如何修复Express中的“错误:发送标头后无法设置标头”

基兰·科金(Kieran Corkin)

我最近正在开发MERN应用程序,最近遇到了麻烦,快递表示我要在发送头之后设置头。

我正在使用mongo db并尝试更新用户配置文件。

我试图注释掉我的res.send发送点以找到问题,但我没有这样做。

这是我用于更新用户个人资料的发布方法:

app.post("/api/account/update", (req, res) => {
    const { body } = req;
    // Validating and Checking Email
    if (body.email) {
      var email = body.email;
      email = email.toLowerCase();
      email = email.trim();
      body.email = email;
      User.find(
        {
          email: body.email
        },
        (err, previousUsers) => {
          if (previousUsers.length > 0) {
            return res.send({
              success: false,
              message:
                "Error: There is already another account with that email address"
            });
          } else {
          }
        }
      );
    }
    // Validating Names Function
    function checkName(name) {
      var alphaExp = /^[a-zA-Z]+$/;
      if (!name.match(alphaExp)) {
        return res.send({
          success: false,
          message: "Error: Names cannot contain special characters or numbers"
        });
      }
    }
    checkName(body.firstName);
    checkName(body.lastName);

    // Making sure that all fields cannot be empty
    if (!body.email && !body.firstName && !body.lastName) {
      return res.send({
        success: false,
        message: "Error: You cannot submit nothing"
      });
    }
    // Getting User ID from the current session
    UserSession.findById(body.tokenID, function(err, userData) {
      // Finding User ID using the current users session token
      if (userData.isDeleted) {
        return res.send({
          success: false,
          message:
            "Error: Session token is no longer valid, please login to recieve a new one"
        });
      }
      // Deleting the token ID from the body object as user table entry doesnt store tokens
      delete body.tokenID;
      // Finding the user profile and updating fields that are present
      User.findByIdAndUpdate(userData.userId, body, function(err, userInfo) {
        if (!err) {
          return res.send({
            success: true,
            message: "Success: User was updated successfully"
          });
        }
      });
    });
  });

这是我对网站后端的呼叫:

onUpdateProfile: function(fieldsObj) {
    return new Promise(function(resolve, reject) {
      // Get Session Token
      const obj = getFromStorage("the_main_app");
      // Defining what fields are getting updated
      fieldsObj.tokenID = obj.token;
      // Post request to backend
      fetch("/api/account/update", {
        method: "POST",
        headers: {
          "Content-Type": "application/json"
        },
        body: JSON.stringify(fieldsObj)
      })
        .then(res => {
          console.log("Verify Token - Res");
          return res.json();
        })
        .then(json => {
          console.log("Verify Token JSON", json);
          if (json.success) {
            window.location.href = `/manage-account?success=${json.success}`;
          } else {
            window.location.href = `/manage-account?success=${json.success}`;
          }
        });
    });
  }

这是我收到的错误消息:

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\kieran.corkin\Desktop\Projects\Mern Template Final\mern-cra-and-server\server\node_modules\express\lib\response.js:767:10)
    at ServerResponse.send (C:\Users\kieran.corkin\Desktop\Projects\Mern Template Final\mern-cra-and-server\server\node_modules\express\lib\response.js:170:12)
    at ServerResponse.json (C:\Users\kieran.corkin\Desktop\Projects\Mern Template Final\mern-cra-and-server\server\node_modules\express\lib\response.js:267:15)
    at ServerResponse.send (C:\Users\kieran.corkin\Desktop\Projects\Mern Template Final\mern-cra-and-server\server\node_modules\express\lib\response.js:158:21)
    at C:\Users\kieran.corkin\Desktop\Projects\Mern Template Final\mern-cra-and-server\server\routes\api\account.js:270:22
    at C:\Users\kieran.corkin\Desktop\Projects\Mern Template Final\mern-cra-and-server\server\node_modules\mongoose\lib\model.js:4641:16
    at process.nextTick (C:\Users\kieran.corkin\Desktop\Projects\Mern Template Final\mern-cra-and-server\server\node_modules\mongoose\lib\query.js:2624:28)
    at _combinedTickCallback (internal/process/next_tick.js:131:7)
    at process._tickCallback (internal/process/next_tick.js:180:9)
[nodemon] app crashed - waiting for file changes before starting...

谁能帮我这个?

编辑

我已经更改了代码,现在似乎可以了,但是放在一起时感觉有点混乱。有重构提示吗?

码:

app.post("/api/account/update", (req, res) => {
    // Preform checks on data that is passed through
    const { body } = req;
    var messages = {
      ExistedUser:
        "Error: There is already another account with that email address",
      NameFormat: "Error: Names cannot contain special characters or numbers",
      BlankInputs: "Error: You cannot submit nothing",
      accountLoggedOut:
        "Error: Session token is no longer valid, please login to recieve a new one",
      successfullyUpdated: "Success: User was updated successfully"
    };
    var usersFound;
    if (body.email) {
      var email = body.email;
      email = email.toLowerCase();
      email = email.trim();
      body.email = email;
      User.find(
        {
          email: body.email
        },
        (err, UserCount) => {
          usersFound = UserCount;
        }
      );
    }
    function capitalize(text) {
      return text.replace(/\b\w/g, function(m) {
        return m.toUpperCase();
      });
    }
    if (body.firstName) {
      body.firstName = capitalize(body.firstName);
    }
    if (body.lastName) {
      body.lastName = capitalize(body.lastName);
    }

    //Making sure that all fields cannot be empty
    if (!body.email && !body.firstName && !body.lastName) {
      return res.send({
        success: false,
        message: messages.BlankInputs
      });
    }
    // Getting User ID from the current session
    UserSession.findById(body.tokenID, function(err, userData) {
      // Finding User ID using the current users session token
      if (userData.isDeleted) {
        return res.end({
          success: false,
          message: messages.accountLoggedOut
        });
      }
      if (userData) {
        // Deleting the token ID from the body object as user table entry doesnt store tokens
        delete body.tokenID;
        // Finding the user profile and updating fields that are present
        User.findByIdAndUpdate(userData.userId, body, function(err, userInfo) {
          if (userInfo) {
            if (!usersFound.length > 0) {
              return res.send({
                success: true,
                message: messages.successfullyUpdated
              });
            } else {
              return res.send({
                success: false,
                message: messages.ExistedUser
              });
            }
          }
        });
      }
    });
  });
克里斯·亚当斯

您打了res.send()两次电话res.send()结束过程。您应该进行重构,以便在完成res.write()后才调用res.send()

该StackOverflow链接更详细地描述了差异。express中的res.send和res.write有什么区别?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Express-发送标头后无法设置标头

错误:发送标头后无法设置标头

UnhandledPromiseRejectionWarning:错误:发送标头后无法设置标头

NodeJs错误:发送标头后无法设置标头

收到错误-发送标头后无法设置标头

表达错误:发送标头后无法设置标头

Express 发送后无法设置标头

错误:发送标头后无法设置标头-在Express Controller中正确处理错误

错误:发送后无法设置标头。

Express.js路由错误:发送标头后无法设置标头

错误:在express-fileupload中发送标头后无法设置标头

Express Static和setHeaders:“错误:发送标头后无法设置标头。”

Express单元测试,带有Chai错误=发送标头后无法设置标头

Express-错误:发送标头后无法设置标头。

Node Express MySQL和错误:发送标头后无法设置标头

带有节点的Express应用程序中的“错误:发送标头后无法设置标头”

在 express js 中的 res.send() 之后发送标头后无法设置标头

如何修复节点中的“发送到客户端后无法设置标头”错误?

如何修复无法设置标头后将其发送到客户端错误?

错误:发送标头后无法设置。在nodejs中

node.js/express 应用程序中的错误:发送后无法设置标头

发送标头后,节点无法设置标头

发送标头后无法设置标头

Express / node.js发送后无法设置标头

发送标头后无法设置。Express JS

发送标头后无法设置。Nodejs Express

node.js / express:发送标头后无法设置标头

航行错误:引发新错误(“发送标头后无法设置标头。”)

Socket.io导致错误“错误:发送标头后无法设置标头”。