所以这可能是一个非常简单的问题,但我已经在谷歌上搜索了一个多小时,但没有找到任何东西。我也只是尝试打印出请求对象,但没有看到任何有用的信息。
如何在 grunt-contrib-connect 中间件定义中获取客户端请求的数据或正文?
connect: {
main: {
options: {
hostname: "0.0.0.0",
port: 8080,
/**
* These are the mocked out backends for various endpoints
*/
middleware: function(connect, options, middlewares) {
middlewares.unshift(function(req, res, next) {
if (req.url !== '/v1/accounts/_findEmail') {
return next();
}
// ********
// How do I get the data content of the request?
var data = req.data; // Is undefined
// ********
if (data && data.email === 'taken@email.com') {
res.writeHead(200, {"Content-Type": "application/json"});
res.write(JSON.stringify({email:"found"}));
} else {
res.writeHead(404, {"Content-Type": "application/json"});
res.write(JSON.stringify({email:"not found"}));
}
res.end();
});
return middlewares;
}
}
}
}
最佳答案
事实证明,要完成这项工作需要做几件事。
如前所述here , connect 在这种情况下基本上只是包装 NodeJS,我应该猜到了。所以那个请求对象实际上是http.ServerRequest , 用法相同。
所以代替 var data = req.data;
我可以添加一个回调,比如 req.on('data', function (data) {//do stuff });
并以这种方式查看数据。
除此之外,在我读取数据之前,我必须添加 req.setEncoding('utf8');
以便它以字符串而不是十六进制数组的形式出现。
所以最终的解决方案是这样的:
connect: {
main: {
options: {
hostname: "0.0.0.0",
port: 8080,
/**
* These are the mocked out backends for various endpoints
*/
middleware: function(connect, options, middlewares) {
middlewares.unshift(function(req, res, next) {
if (req.url !== '/v1/accounts/_findEmail') {
return next();
}
req.setEncoding('utf8');
req.on('data', function (rawData) {
var data = JSON.parse(rawData);
if (data && data.email && data.email === 'taken@email.com') {
res.writeHead(200, {"Content-Type": "application/json"});
res.write(JSON.stringify({email:"found"}));
} else {
res.writeHead(404, {"Content-Type": "application/json"});
res.write(JSON.stringify({email:"not found"}));
}
res.end();
});
});
return middlewares;
}
}
}
}
关于javascript - 从 grunt-contrib-connect 请求对象获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26979016/