我知道有几个问题与我的问题有关,但我觉得它们都没有用:
- 这个不适用于我的情况,我实际上得到了答案,它是我无法得到的内容。
- 在这一个,另一方面,问题是异步调用的错误处理,这不是我的情况 这里,我真的没有完全理解这个问题
那么,我认为这是一个合理的问题。我实际上在我的服务器上执行一些加密(节点中的快速路由)通过post请求:
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测试了这个,它正在工作。当服务器接收到请求时,正在生成加密消息。
同时,我正在用摩卡测试我的东西,我是这样做的:
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——data "key=secret&message=very importantstuffiabsolutlyneedtoprotect " localhost:2409/encrypt
实际上我一开始就做得很好,问题确实与我提到的第二个问题相同,我实际上是在post数据到达之前用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将不会等待应答。