使用 res.send 表达 app.param 问题

Posted

技术标签:

【中文标题】使用 res.send 表达 app.param 问题【英文标题】:Express app.param issue with res.send 【发布时间】:2016-01-26 07:27:48 【问题描述】:

我正在尝试发送回复,但我不确定该怎么做。当我尝试运行“res.send 或 res.response”此代码时,我收到此错误 Can't set headers after they are sent

我创建路由的方式是,如果输入了 /id,那么我将执行 SQL 查询来检查 TableA 中是否存在该 id。如果 id 存在,那么我将得到该项目,例如。 food,在对应于该 id 的 table_type 列中。然后我将转到名为 table 的 table_type 项目,例如。食物,我将从该表中获取属性并发送响应或呈现页面。

// parameter middleware that will run before the next routes
app.param('num', function(req, res, next, num) 
  var array = [];
  var id;
  var table;
  client.connect(function(err) 
    if(err) 
      return console.error('could not connect to postgres', err);
    
    client.query("SELECT id, table_type FROM TableA WHERE id=" + num, function(err, result1) 
      if(err) 
        return console.error('error running query', err);
      
      else 
        //console.log("###### THIS IS IT!!! #######");
        //console.log(result1);
        id = result1.rows[0].id;
        table = result1.rows[0].table_type.trim();

        var latitude;
        var longitude;
        if (table === "Food") 
          var name;
          var description;
          client.query("SELECT name, description, quantity, color FROM FoodTable WHERE item_id=" + id, function(err, result2) 
            if(err) 
              return console.error('error running query', err);
            
            else 
              name = result2.rows[0].name.trim();
              description = result2.rows[0].description.trim();
              quantity = result2.rows[0].quantity.trim();
              color = result2.rows[0].color.trim();
              array.push(name, description, quantity, color);
              console.log(array);
              //---- WHY NO WORK? ------
              res.send(array);
            
            client.end();
          );
        
      
      client.end();
    );
  );
  next();
);

代码的文字解释: 我正在尝试编写路由,通过调用 SQL 查询client.query,使用 app.param 检查 id 是否存在于 TableA 中。我不能在函数外部使用变量,因为一旦函数调用完成,数据将不会被引用。所以我已经连接了我的查询。因此,一旦 ID 存在于 TableA 中,我将 idtable_type 存储到变量中并检查 if 语句中的类型。因此,如果表类型是 Drinks,那么我会查看 Drinks 表以获取与 id 关联的属性。

【问题讨论】:

【参考方案1】:

您在异步数据库调用之外调用 next()。所以发生的情况是 next 已经执行并返回了对请求的响应,因此在调用 res.send 方法时已经设置了标头。

【讨论】:

我尝试删除下一个,但代码不起作用。你能推荐一些编写同步代码的技巧或教程吗? 您还在执行第一个查询后调用 client.end(),这可能是问题,因为执行第二个查询时客户端不存在。从第一个查询的回调中删除 client.end()。如果您需要同步代码的不同部分,请查看 github.com/caolan/async 和 github.com/kriskowal/q 但是,我建议您先查看教程以了解 javascript 回调。 我解决了这个问题。结果我有两个路由器呼叫。感谢您的意见:)

以上是关于使用 res.send 表达 app.param 问题的主要内容,如果未能解决你的问题,请参考以下文章

node-express 错误:表示不推荐使用 res.send(status):请改用 res.sendStatus(status)

认识 Express 的 res.send() 和 res.end()

Nodejs 和 Express,使用来自工作线程的 res.send()

无法在承诺内调用 res.send()

在 express 中 res.send 和 res.write 有啥区别?

res.send()传参----Invalid status code: 1