expressjs-未设置响应主体

时间:2018-10-14 06:09:07

标签: node.js postgresql express

在以下NodeJS API中,将PostgreSQL数据库插入多行,然后需要发送响应主体。由于在多种情况下可能会出现错误,因此我需要使用消息代码来设置响应主体,以帮助识别可能的原因。因此,我正在使用一个resp对象,该对象将持有一个code键以用于消息代码。该对象将在状态为200(成功)或500(错误)的HTTP响应中发送。

但是,我总是收到一个空的响应正文。可变范围可以吗?

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 :(得分:0)

发生什么情况是在查询完成之前发送了您的响应。您的查询执行是异步的,res.send(resp)不会等到查询执行完毕。

变量resp是在回调内部设置的,因此为空。

您可以尝试使用async-await与promise包装器进行同步执行,以并行执行在循环内运行的查询。注意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'});
    }
});

答案 1 :(得分:0)

尝试类似的方法

 try
                                {
                                    startActivity(new Intent(this,
                                            getClassLoader().loadClass(MySingleton.getInstance().getCurrentCallingActivity())));
                                    finish();
                                }catch (ClassNotFoundException e)
                                {
                //your code
                                    finish();
                                }