【问题标题】:how to pass data and redirect in express如何在快递中传递数据和重定向
【发布时间】:2020-09-29 12:22:17
【问题描述】:

我的代码是

main.post('/userlist', function(req, res, next) {
    // where did you get this?
    // var db = req.db;
    var query = connection.query("SELECT name,zaman,giriscikis FROM giriscikis where date_format(zaman,'%Y-%m-%d') between ? and ?", [req.body.bas, req.body.bitis], function(err, result) {
        if (err) throw err;

        console.log(result);

        res.send(httpResponse(result));
        return res.redirect('/zamansorgu');

        //console.log(req.body.bas)
        //console.log(req.body.bitis)
    });
});

我想从数据库中获取数据并重定向到代码中的同一页面(zamansorgu.html)

但我得到一个错误

Cannot set headers after they are sent to the client

我该如何解决这个问题

感谢您的帮助

【问题讨论】:

标签: node.js express


【解决方案1】:

您正在尝试发回 JSON 数据并重定向到不同的页面。那是不可能的。每个端点请求可以有一个响应,而不是更多。您可以发回数据或重定向。那是因为重定向确实也会发回数据(新目标页面的 html)。

从调用者的角度考虑它。如果它确实允许这样做,它将如何工作?如果有人从浏览器中使用此链接,浏览器应该显示您返回的 JSON 数据,还是应该将用户带到新页面?

错误是说“嘿,我已经发回了数据。我现在无法重定向,因为我们已经在返回一些 JSON 的路径上”。

如果您想使用数据来格式化可以完成的输出,或者如果您想重定向到新位置并在 url 中传递数据,这也是可能的。考虑这样的代码:

main.post('/userlist', function(req, res, next) {
    // var db = req.db;
    var query = connection.query("SELECT name,zaman,giriscikis FROM giriscikis where date_format(zaman,'%Y-%m-%d') between ? and ?", [req.body.bas, req.body.bitis], function(err, result) {
        if (err) return next(err);

        if (result.urlparam) {
          // this builds a new url using the query value
          const nextUrl = `/zamansorgu?param=${result.urlparam}`;
          return res.redirect(nextUrl);
        }
        else {
          // this builds html here
          const html = `<html><body><h1>${result.title}</h1></body></html>`;
          return res.send(html);
        }
    });
});

【讨论】:

  • 你希望这个 url 的调用者返回什么?数据或重定向指令?你必须决定一个或另一个
  • 我可以通过这个数据来获取函数吗?
  • 我想在html页面中使用这个数据来显示表格中的数据
  • 您可以以任何方式使用数据并格式化输出或使用它来重定向,但您不能对一个请求发送 2 个响应。我更新了答案以显示一些假设的选项
【解决方案2】:

我也遇到过这个问题,就我而言,这是一个相当具有欺骗性的小错误。然而,节点检查器会话帮助我快速查明问题。我的问题非常棘手,下面示例中的 res.end 调用是有问题的行。

res.writeHead(200, {"Content-Type": "application/json"});
res.end(JSON.stringify(someObject));

someObject 在重构后不存在,这导致了 ReferenceError 被抛出。 Router.prototype._dispatch 中有一个 try-catch 捕获 ReferenceError 并将其传递给 next

【讨论】:

    猜你喜欢
    • 2022-08-05
    • 2021-08-03
    • 1970-01-01
    • 2012-11-22
    • 2014-10-10
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    相关资源
    最近更新 更多