Nodejs Обещание "res.end is not function" error - PullRequest
0 голосов
/ 26 февраля 2020

Я выполняю рефакторинг своего кода для удаления «ада обратного вызова» с помощью Promises, но обнаружена ошибка, которую я не могу передать. Мой код получает список идентификаторов и обрабатывает их, делая несколько вызовов базы данных, поэтому у меня был этот «ад обратного вызова». Все работало нормально до обещаний. res равно 0, когда я должен был ответить клиенту.

  function processVMDelete(returnedVMIDs){
    return new Promise((resolve, reject) => {

        var mariasqlClient = dbConnection();
        mariasqlClient.query( sqlUpdateDELETE_STATE_ByVMID, [ 
          'DELETE', 
          returnedVMIDs
        ], function(err, rows) {
          if (err){
            reject(err);
          }
          console.log('finish update');
// dont' need to return anything here
          resolve(0);
        });
        mariasqlClient.end();
    });
  }

  function getListExpVM(){
    return new Promise((resolve, reject) => {

      var vmList = [];
      var mariasqlClient = dbConnection();
      mariasqlClient.query( sqlSearch_ByUSERNAMEAndSTATE, [ 
        requesterUsername, 
        'ACTIVE'
      ], function(err, rows) {
        if (err){
          reject(err);
        }
          vmList = filterExpiredVMs(rows);

          var response = {
            status : 200,
            success : 'Successfull',
            data : vmList,
            requester: requesterUsername
          };
          resolve(response);
      }); 
      mariasqlClient.end();
    });
  }



router.post('/processVMs', function(req, res) {
    var returnedVMIDs = JSON.parse(req.body.data);

    processVMDelete(returnedVMIDs)
      .then(res => {
        console.log('done');

        // check if there is more available for the user:
        getListExpVM()
          .then(response => {
            console.log('sending back list of VMs');

//===>>> ERROR HERE: res.end is not a function
            res.end(JSON.stringify(response));

          })
          .catch(err => {
            console.log('error', err.message);
            logger.error("Error getting expired VMs: " + err.message);

//===>>> ERROR HERE: res.send is not a function
            res.status(500).send({error: err.message})
          });
      })
      .catch(err => {
        console.log('error', err.message);
        logger.error("Error processing VMs: " + err.message);
//===>>> ERROR HERE: res.send is not a function
        res.status(500).send({error: err.message})
      });
});

1 Ответ

0 голосов
/ 26 февраля 2020

Вы переопределили res с помощью этого:

processVMDelete(returnedVMIDs)
  .then(res => {...})

Это скроет более высокую область res, связанную с общим запросом (тот, который вам нужно использовать для res.end()). Измените имя этого на другое, например result, а затем измените соответствующие ссылки, которые используют этот result.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...