使用res.send快速app.param问题

时间:2016-01-26 07:27:48

标签: javascript sql node.js postgresql express

我正在尝试发送回复,但我不确定如何做到这一点。当我尝试运行“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();
});

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

1 个答案:

答案 0 :(得分:0)

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