【问题标题】:Wait for JSON response data from POST request in nodejs (mocha test)在nodejs中等待来自POST请求的JSON响应数据(摩卡测试)
【发布时间】:2015-11-18 10:48:35
【问题描述】:

我知道有几个问题与我的相关,但我没有发现其中任何一个有用:

  • this one 不适用于我的情况,我实际上得到了答案,是我无法得到的内容。
  • on this one,另一方面,问题是对异步调用的错误处理,这不是我的情况
  • there,嗯,这个问题我真的没看懂
  • 等等……

那么,我认为这是一个合理的问题。我实际上是通过发布请求在我的服务器中执行一些加密(节点中的快速路由):

app.post('/encrypt', encrypt);

加密正在做:

function encrypt(req,res) {
    if(req.body.key && req.body.message) {
        var encryptedMessage = Encrypter.encrypt(req.body.key,req.body.message);

        return res.status(200).json({ message: encryptedMessage });
     }

     res.status(409).json({ message: 'the message could not be encrypted, no key found' });
    }
}

所以,我通过 console.log 对此进行了测试,它正在工作。当服务器收到请求时,正在生成加密消息。

同时,我正在用 mocha 测试我的东西,我正在这样做:

describe('# Here is where the fun starts ', function () {
  /**
   * Start and stop the server
   */
  before(function () {
    server.listen(port);
  });

  after(function () {
    server.close();
  });

  it('Requesting an encrypted message', function(done) {
    var postData = querystring.stringify({
      key : key,
      message : message
    });

    var options = {
      hostname: hostname,
      port: port,
      path: '/encrypt',
      method: 'POST',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': postData.length
      }
    };

    var req = http.request(options, function(res) {
      res.statusCode.should.equal(200);
      var encryptedMessage = res.message;
      encryptedMessage.should.not.equal(message);
      done();
    });

    req.on('error', function(e) {
      //I'm aware should.fail doesn't work like this
      should.fail('problem with request: ' + e.message);
    });

    req.write(postData);
    req.end();
  });
});

所以,每当我执行测试时,它都会以Uncaught TypeError: Cannot read property 'should' of undefined 失败,因为 res.message 不存在。

所有 res.on (data, end, events 都不起作用,所以我想数据应该可以从那里获得。首先我有这个:

var req = http.request(options, function(res) {
  res.statusCode.should.equal(200);
  var encryptedMessage;

  res.on('data', function (chunk) {
    console.log('BODY: ' + chunk);
    encryptedMessage = chunk.message;
  });

  encryptedMessage.should.not.equal(message);
  done();
});

但 res.on 从未被访问过(console.log 没有显示任何内容)。因此,我有点卡在这里。我肯定做错了一些基本的事情,但我不知道,我发现的许多问题似乎不适用于我的情况。

很奇怪,如果我启动一个测试服务器然后我 curl 它 curl --data "key=secret&message=veryimportantstuffiabsolutellyneedtoprotect" localhost:2409/encrypt

Curl 一直在等待。

【问题讨论】:

  • 您是否包含正文解析器中间件? github.com/expressjs/body-parser
  • 嗯,我想这是一个答案......我明天会做并接受你的回答......谢谢!
  • 其实我在用它。 var bodyParser = require('body-parser'); app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()); 这一切都在app.use(passport.initialize()); 之前,所以这不是问题......
  • 看起来我的加密应该接收一个额外的参数,并调用 next()。不幸的是,这下一个也是写响应头,然后,当我调用时,它会抛出异常Error: Can't set headers after they are sent.

标签: node.js http express mocha.js


【解决方案1】:

实际上我一开始就做得很好,问题确实与the second question I mentionned 相同,我实际上是在发布数据到达之前用 done() “清除”我的上下文。解决办法是:

  var req = http.request(options, function(res) {
    res.statusCode.should.equal(200);

    res.on('data', function(data) {
      encryptedMessage = JSON.parse(data).message;
      encryptedMessage.should.not.equal(message);
      done();
    });
  });

只有在数据受到威胁时才会调用 done()。否则,mocha 将不会等待答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多