节点应用程序的响应不返回任何内容,但应返回数组

时间:2014-10-02 20:02:27

标签: node.js express

我正在测试一个基于快速框架构建的nodeJS服务器。

当请求发送到服务器时,服务器应以数组的形式发回一些数据。而是发回''

我试图通过的测试如下:

it('should send postgres data to the server', function(done) {
  request(app)
  .post('/chart')
  .send({min:"1",max:"100",arrayLength:"12"})
  .expect(200, sqlData)
  .end(function(err, res){
    if(err) {
      done(err);
    } else {
      done();
    }
  });
});

请注意,sqlData等于发送的响应应该是什么。

当路由器收到POST请求时,它会执行以下操作:

router.post('/', function(req, res) {
    res.send(randomSqlTableSelector(req.body.min,req.body.max,req.body.arrayLength));
});

我已经检查过req.body.min,max和arrayLength是我期望它们的所有数字。

因此,问题可能在我的函数randomSqlTableSelector中,无论出于何种原因,当在路由器内部调用时,simple返回空引号''

功能如下:

function randomSqlTableSelector(min,max,arrayLength) {
    var filledArray = [];
    pg.connect(conString, function(err, client, done) {
        if(err) {
            return console.error('error fetching client from pool', err);
        }
        client.query('SELECT cell1 FROM random AS retrievedNumber;', function(err, result) {
            var psqlData = result.rows;
            for (i in psqlData) {
                filledArray.push(psqlData[i]["cell1"])
            }
            return filledArray
        });
    });
}

1 个答案:

答案 0 :(得分:2)

您不能将执行异步,非阻塞任务的函数视为同步和阻塞。尝试传递一个回调:

function randomSqlTableSelector(min, max, arrayLength, cb) {
  pg.connect(conString, function(err, client, done) {
    if (err)
      return cb(err);
    client.query('SELECT cell1 FROM random AS retrievedNumber;', function(err, result) {
      if (err)
        return cb(err);
      var psqlData = result.rows,
          filledArray = [],
          i;
      for (i in psqlData)
        filledArray.push(psqlData[i]["cell1"])
      cb(null, filledArray);
    });
  });
}

然后在您的路线中使用它,如:

router.post('/', function(req, res) {
  var min = req.body.min,
      max = req.body.max,
      len = req.body.arrayLength;
  randomSqlTableSelector(min, max, len, function(err, array) {
    if (err) {
      console.log(err);
      return res.send(500);
    }
    res.send(array);
  });
});