代码之家  ›  专栏  ›  技术社区  ›  cogitoergosum

expressjs-未设置响应正文

  •  1
  • cogitoergosum  · 技术社区  · 7 年前

    在下面的nodejsapi中,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 回复  |  直到 7 年前
        1
  •  0
  •   hdk    7 年前

    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);
    }
    
        2
  •  0
  •   hdk    7 年前

    所发生的是在查询完成之前发送响应。您的查询执行是异步的并且 res.send(resp)

    变量 resp 在回调中设置,因此为空。

    您可以尝试使用async await for synchronized execution和promise wrapper来并行执行循环内运行的查询。注意 async function .

    这就是如何使用节点mysql2/promise完成的。异步意味着您在query()中提供的回调函数将在执行查询后被调用。并且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'});
        }
    });
    
    推荐文章