我遇到了一个奇怪的处理问题。当我不使用express时,我能够通过NodeJS检索预期的响应。
下面是我的代码片段,它与NodeJS配合使用
var http = require('http');
var url = require('url');
function start(route, handle){
function onRequest(request, response){
var postData = "";
var pathName = url.parse(request.url).pathname;
console.log('request obtained for '+pathName);
request.setEncoding('utf8');
request.addListener('data', function(chunk){
postData += chunk;
console.log(chunk);
});
request.addListener('end', function(){
**console.log(request.headers);**
route(handle, pathName, response, postData);
});
}
http.createServer(onRequest).listen(69);
console.log('server start on 69');
}
exports.start=start;
请求处理程序文件的一部分,并在提交表单数据时调用上载函数。我打印的标题来自我在请求结束时的监听器。
function upload(response, postData){
console.log('Request handler upload');
var res = querystring.parse(postData).text;
console.log(res);
response.writeHead(200, {"Content-Type":"text/html"});
response.write('You sent a text: '+res);
console.log(postData);
response.end();
}
我对上传功能进行的卷曲调用(此处我尚未上传任何文件或图片,因此现在只进行文本传输)
curl -d "username=moderation&moderation.item[0].uid=4&moderation.item[0].action=approved" -H 'Content-Type: application/x-www-form-urlencoded' http://localhost:69/upload
来自curl调用的请求标头调用nodejs上运行的应用程序
{ 'user-agent': 'curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3',
host: 'localhost:69',
accept: '*/*',
'content-type': 'application/x-www-urlencoded',
'content-length': '75' }
request to router for path/upload
Request handler upload
text=moderation&moderation.item[0].uid=4&moderation.item[0].action=approved
当你看到身体按预期出现时。
现在,下面是我的快递应用程序的代码,几乎可以做同样的事情。
/**
* Module dependencies.
*/
var express = require('express')
, routes = require('./routes')
, user = require('./routes/user')
, http = require('http')
, path = require('path');
var app = express();
// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
// development only
if ('development' == app.get('env')) {
app.use(express.errorHandler());
}
app.get('/', routes.index);
app.get('/users', user.list);
/**custom stuff**/
app.post('/upload',function(req, res){
console.log(req.header('Content-Type'));
console.log(req.header('Host'));
console.log(req.header('User-Agent'));
console.log(req.body);
res.send("<h1> Hello the response is "+req.body.username);
});
/** end**/
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
以下是我对此上传方法的卷曲调用。
curl -d "username=moderation&moderation.item[0].uid=4&moderation.item[0].action=approved" -H 'Content-Type: application/x-www-form-urlencoded' http://localhost:3000/upload
标题和响应如下。
application/x-www-form-urlencoded
localhost:3000
curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
{ username: 'moderation',
'moderation.item': { '0].ui': '4', '0].actio': 'approved' } }
POST /upload 200 69ms - 32b
所以回来的反应体是扭曲的。当我调用我的nodejs应用程序时,我正在
text=moderation&moderation.item[0].uid=4&moderation.item[0].action=approved
而对于我的快递应用,我正在
{ username: 'moderation',
'moderation.item': { '0].ui': '4', '0].actio': 'approved' } }
我尝试过使用connect.bodyParser()&amp;也只是表达.urlencoded(),认为bodyParser方法已经搞砸了我的帖子数据。我仍然认为它是bodyParser,但我无法找到摆脱这个问题的方法。
很抱歉帖子的长度,但我想提供所有可能的数据。
感谢任何帮助。
谢谢。