2013-07-14 2 views
0

Я новичок в узле js & express. Сегодня я смог получить свою первую форму Node JS и работает так, как ожидалось. Поэтому я хотел воссоздать то же самое в Express, но по какой-то причине я программно терпит неудачу. Я могу отслеживать заголовки и тело вниз, но по какой-то причине я не понимаю, почему Экспресс переписывает способ обработки тела.Экспресс переписывает тело по вызову curl

Я добавлю свои выводы. Ниже приведен код, который был сгенерирован с помощью инструмента командной строки. Это файл app.js, загрузка метода ищет некоторые данные. В настоящий момент я не обрабатываю какие-либо загрузки файлов, я ищу только какой-то текст.

/** 
* 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("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":"myname"}' -H 'Content-Type: application/x-www-form-urlencoded' http://localhost:3000/upload 

И эти заголовки и тело. (Заголовки заканчиваются на линии 3, тело находится на линии 4)

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":"myname"}': '' } 
POST /upload 200 7ms - 36b 

Теперь я Advanced Rest Client App для Google Chrome и ниже заголовков и тело.

application/x-www-form-urlencoded 
localhost:3000 
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36 
{ username: 'myname from adv rest client app' } 
POST /upload 200 5ms - 58b 

Итак, одна вещь, которая сбивает с толку меня, почему тело за просьбу остальное приложение клиента быть хорошо сформированы и нетронутыми, а тело от моего запроса искажается. Может ли кто-нибудь помочь мне с этим здесь.

Спасибо

+0

Попробуйте либо [ '-d«имя пользователя = myname'' ] (http://superuser.com/a/149335) или ['-H 'Content-Type: application/json''] (http://stackoverflow.com/a/477819), может быть? В противном случае, похоже, у вас есть несоответствие между используемым форматом данных (JSON) и указанным форматом (URL-кодирование). –

+0

Получил! это была проблема. Можете ли вы добавить это как ответ, поэтому я могу закрыть этот вопрос – macha

ответ

0

Проблема может быть в комбинации данных/заголовка команды curl, поскольку, как представляется, несоответствие между форматом данных, используемых (JSON):

-d '{"username":"myname"}' 

а также формат указано (URL-кодировке):

-H 'Content-Type: application/x-www-form-urlencoded' 

Для URL-encoded data, попробовать:

-d 'username=myname' 

Кроме того, поскольку вы работаете с загрузкой файлов, вы, вероятно, хотите, чтобы указать multipart/form-data или использовать -F/--form option, который устанавливает его:

curl -F 'username=myname' http://localhost:3000/upload 
Смежные вопросы