2016-01-26 2 views
1

Я пытаюсь отправить ответ, но я не уверен, как это сделать. Я получаю эту ошибку Can't set headers after they are sent, когда пытаюсь запустить «res.send или res.response» этот код.Экспресс-сообщение app.param с res.send

Способ создания моих маршрутов заключается в том, что если/id был введен, я сделаю SQL-запрос, чтобы проверить наличие этого идентификатора в TableA. Если идентификатор существует, я получу элемент, например. в столбце table_type, соответствующем этому id. Затем я перейду к этому элементу table_type с именем table, например. Пища, и я получу атрибуты из этой таблицы и отправлю ответ или сделаю страницу.

// 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(); 
}); 

сформулированное Explaination кода: Я пытаюсь написать маршруты, которые бы проверить, если идентификатор существует в TableA использовании app.param путем вызова SQL запроса client.query. Я не могу использовать переменные вне функции, так как данные не будут указаны после завершения вызова функции. Поэтому я связал свой запрос. Поэтому, как только id существует в TableA, я сохраняю id и table_type в переменной и проверяю тип в выражении if. Поэтому, если тип таблицы был Drinks, я бы посмотрел в таблице Drinks, чтобы получить атрибуты, связанные с идентификатором.

ответ

0

Вы вызываете next() вне асинхронного вызова базы данных. Итак, что происходит, так это то, что следующий уже выполнен и возвращает ответ на запрос, поэтому заголовки уже были установлены при вызове метода res.send.

+0

Я попытался удалить следующий, но код не работает. Можете ли вы предложить советы или любой учебник по написанию синхронного кода? –

+0

Вы также вызываете client.end() после выполнения первого запроса, что может быть проблемой, поскольку клиент не будет существовать для выполнения второго запроса. Удалите client.end() из обратного вызова первого запроса. Если вам нужно синхронизировать разные части кода, посмотрите на https://github.com/caolan/async и https://github.com/kriskowal/q, однако я бы предложил вам изучить учебники для сначала понимая обратные вызовы javascript. – Hassaan

+0

Я исправил проблему ... У меня два вызова маршрутизатора. Спасибо за ваш вклад :) –

Смежные вопросы