首页 > 解决方案 > 板子用node.js实现重定向错误

问题描述

我想在写完一篇新文章后转到详细信息视图。但是如果同时使用 res.reder 和 res.redirect 会报错。那么,我们可以用什么方法来移动呢?

github:https ://github.com/ChoYoungHo-web/watchingame_project

控制器.js

export const getBoardCreate = (req, res) =>
  res.render("boardCreate", {
    homeName: "watchingame",
    pageName: "boardCreate",
    routers
  });
export const postBoardCreate = (req, res) => {
  try {
    let sql =
      "insert into board(folder,title,content, nicName,writeDate,views,comments) values(?,?,?,1,now(),0,0)";
    dbConnection.query(
      sql,
      [req.body.folder, req.body.title, req.body.content],
      (err, result) => {
        if (err) {
          console.log(err);
        } else {
          res.render("boardCreate", {
            homeName: "watchingame",
            pageName: "boardCreate",
            routers,
            result
          });
        }
      }
    );
  } catch (err) {
    console.log(err);
  }
  res.redirect(/board${routers.boardDetail(?)});
};

标签: node.js

解决方案


这段代码的问题是:无论插入操作成功与否,res.redirect()都会一直执行(在返回查询结果之前),向浏览器发送HTTP响应。插入操作成功后,res.render()调用 ,再次尝试向浏览器发送 HTTP 响应。这在 Node.js 中是不允许的,因为它会对 1 个请求返回 2 个 HTTP 响应。

为了实现需求:boardCreate插入操作成功时渲染boardDetail,失败时重定向到,需要res.redirect()catch块内移动:

export const postBoardCreate = (req, res) => {
  try {
    let sql =
      "insert into board(folder,title,content, nicName,writeDate,views,comments) values(?,?,?,1,now(),0,0)";
    dbConnection.query(
      sql,
      [req.body.folder, req.body.title, req.body.content],
      (err, result) => {
        if (err) {
          console.log(err);
          res.redirect(/board${routers.boardDetail(?)});
        } else {
          res.render("boardCreate", {
            homeName: "watchingame",
            pageName: "boardCreate",
            routers,
            result
          });
        }
      }
    );
  } catch (err) {
    console.log(err);
    res.redirect(/board${routers.boardDetail(?)});
  }
};

推荐阅读