expressjs - тело ответа не задано - PullRequest
0 голосов
/ 14 октября 2018

В следующем API-интерфейсе NodeJS база данных PostgreSQL вставляется с несколькими строками, а затем необходимо отправить тело ответа.Поскольку существует несколько сценариев, в которых может быть ошибка, мне нужно настроить тело ответа с кодом сообщения, который помогает определить возможную причину.Поэтому я использую объект resp, который будет содержать клавишу code для кода сообщения.Этот объект будет отправлен в ответ HTTP, где статус будет 200 (успех) или 500 (ошибка).

Однако я продолжаю получать пустое тело ответа.Область видимости переменной в порядке?

router.post('/', function (req, res, next) {
  rdbmsPool.connect((err, client, release) => {
    if (err) {
      var resp = {
        'Request-Id' : req.get('X-Request-Id'),
        'code' : 'code'
      }
      res.status(500)
      res.send(resp)
    } else {
      var resp = {}
      for (k in someArray) {

          client.query(queryString, colValues, (err, result) => {
            if (err) {
              resp = {
                'Request-Id' : req.get('X-Request-Id'),
                'code' : 'code'
              }
              res.status(500)
            } else {
              resp = {
                'Request-Id' : req.get('X-Request-Id'),
                'code' : 'code'
              }
              res.status(200)       
            }
          })
        }
      for (k in someOtherArray) {
          client.query(queryString, colValues, (err, result) => {
            if (err) {
              resp = {
                'Request-Id' : req.get('X-Request-Id'),
                'code' : 'code'
              }
              res.status(500)
            } else {
              resp = {
                'Request-Id' : req.get('X-Request-Id'),
                'code' : 'code'
              }
              res.status(200)       
            }
          })
        }
    release()
    res.send(resp)        
    }
  })
});

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Попробуйте что-то вроде этого

let array1 = [];
for(k in someArray){
    array1.push(client.query(queryString, colValues));
}

let array2 = [];

for (k in someOtherArray) {
    array2.push(client.query(queryString, colValues));
}

try{
    const results1 = await Promise.all(array1);
    const results2 = await Promise.all(array2);
    // if it comes here queries are successful
}
catch(error){
    //send 500 here. any query have failed
    console.log(error);
}
0 голосов
/ 14 октября 2018

Что произойдет, если ваш ответ будет отправлен до завершения запроса.Ваш запрос выполняется асинхронно и res.send(resp) не ожидает выполнения запросов.

Переменная resp установлена ​​внутри обратных вызовов, поэтому она пустая.

Вы можете попробовать использовать async-await для синхронизированного выполнения с оболочкой обещаний для parrelel выполнения запросов, которые выполняются внутри цикла.Примечание async function.

Вот как это можно сделать с помощью узла mysql2 / promise.Асинхронный означает, что функция обратного вызова, которую вы предоставляете в query (), будет вызываться после выполнения запроса.и код после query () будет выполняться не дожидаясь завершения функции запроса.

router.get('/getDayTypes',async function (req, res, next) {
    const API_NAME='getDayTypes get, ';

    try{
        const conn = await pool.getConnection();
            // Do something with the connection
        var promise1 = conn.execute(`
        SELECT 
            ID_DAY_TYPES,
            DAY_NAME
        FROM
            hrm_calendar_day_types 
        WHERE
            IS_ACTIVE = '1'`);


        const values = await Promise.all([promise1]);
        conn.release();

        return res.status(200).send({success:true, data:values[0][0]});
    }

    catch(err){
        logger.error(API_NAME + 'error :' + err);
        return res.status(500).send({success:false, message:'Query Error'});
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...