2013-03-18 4 views
2

Я использовал jQuery для отправки ajax некоторым данным на веб-сервер nodejs.Получить полезную нагрузку сообщения

Код веб-сервера получает сообщение, но я не знаю, как извлечь полезную нагрузку, а веб-узел документации nodejs просто ужасен. Я попытался сбросить объект запроса на консоль отладчика, но я не вижу данных там. Как получить доступ к полезной нагрузке?

В документации сказано, объект запроса является экземпляром http.IncomingMessage и выставляет data событие с подписью function (chunk) { } где фрагмент является либо строкой или Buffer, но если вы не знаете, где и как вы должны подключить до этого события, или как использовать буфер, это не очень полезно.


Я заметил, что есть второй, более описательная руководство скрыты под «сообщество», а не по ссылке «DOCS». Это хорошо. В настоящее время он недоступен. Это не так хорошо.


Меня спрашивали, использую ли я фреймворк или пытаюсь сделать это «родным». Незнание мешает мне отвечать прямо, так что вместо этого здесь код

var http = require('http'); 
var fs = require('fs'); 
var sys = require('sys'); 
var formidable = require('formidable'); 
var util = require('util'); 
var URL = require('url'); 

var mimeMap = { htm : "text/html", css : "text/css", json : "application/json" }; 

var editTemplate = fs.readFileSync("edit.htm").toString(); 

http.createServer(function (request, response) { 

    request.addListener('data', function(chunk){ 
    console.log('got a chunk'); 
    }); 

    var body, token, value, mimeType; 
    var path = URL.parse(request.url).pathname; 

    console.log(request.method + " " + path); 

    switch (path) { 
    case "/getsettings": 
     try { 
     mimeType = "application/json"; 
     body = fs.readFileSync("/dummy.json"); 
     } catch(exception) { 
     console.log(exception.text); 
     body = exception; 
     } 
     //console.log(body.toString()); 
     break; 
    case "/setsettings": 
     console.log(request); //dump to debug console 
     //PROCESS POST HERE 
     body = ""; //empty response 
     break; 
    case "/": 
     path = "/default.htm"; 
     mimeType = "text/html"; 
    default: 
     try { 
     mimeType = mimeMap[path.substring(path.lastIndexOf('.') + 1)]; 
     if (mimeType) { 
     body = fs.readFileSync(path); 
     } else { 
      mimeType = "text/html"; 
      body = "<h1>Error</h1><body>Could not resolve mime type from file extension</body>"; 
     } 
     } catch (exception) { 
     mimeType = "text/html"; 
     body = "<h1>404 - not found</h1>"; 
     } 
     break; 
    } 
    response.writeHead(200, {'Content-Type': mimeType}); 
    response.writeHead(200, {'Cache-Control': 'no-cache'}); 
    response.writeHead(200, {'Pragma': 'no-cache'}); 
    response.end(body); 
}).listen(8124); 

console.log('Server running at http://127.0.0.1:8124/'); 

Теперь я добавил этот

request.addListener('data', function(chunk){ 
    console.log('got a chunk'); 
}); 

к началу функции успеха для createServer. Кажется, это работает так, что, я полагаю, означает, что функция успеха называется до слушателей. Если это не правильное место для привязки, тогда кто-то скажет мне.

+0

Вы используете какой-то веб-фреймворк, такой как экспресс, или пытаетесь ли вы сделать это «родным» способом? –

+0

См. Измененный вопрос –

ответ

2

В «// ПРОЦЕССЕ ПОЧТА ЗДЕСЬ» добавьте req.pipe(process.stdout);, он выведет данные сообщения на консоль.

Также можно передать его в файл req.pipe(fs.createWriteStream(MYFILE)) или даже обратно в браузер req.pipe(res);

Смотрите пример здесь: http://runnable.com/nodejs/UTlPMl-f2W1TAABS

Вы также можете добавить свои собственные обработчики для событий, данных, ошибки и конец

var body = ''; 

request.addListener('data', function(chunk){ 
    console.log('got a chunk'); 
    body += chunk; 
}); 

request.addListener('error', function(error){ 
    console.error('got a error', error); 
    next(err); 
}); 

request.addListener('end', function(chunk){ 
    console.log('ended'); 
    if (chunk) { 
    body += chunk; 
    } 
    console.log('full body', body); 
    res.end('I have your data, thanks'); 
}); 

о, и, как в «родной или модуля» вопрос, вы можете использовать модуль как экспресс, который будет разбирать тело для вас, и заселить req.body с результатом (пропуск addListe боль и даже синтаксический анализ formdata или json для вас). См. http://expressjs.com/api.html#req.body

+0

Спасибо, это очень полезно. Как вы можете видеть в моем собственном примере кода, я только что обнаружил привязку обработчиков, которые вы предлагаете, и хотя мои данные хорошо вписываются в один кусок, я все равно благодарен за объяснение того, как накапливать куски. Не могли бы вы уточнить, где * эти события должны быть объявлены? Я делаю это в нужном месте? –

+0

У вас есть правильное пятно с надписью «// PROCESS POST HERE», хотя вы можете также проверить, что 'req.method === 'POST'', снова такая библиотека, как экспресс, упростит использование' app.post ('/ setSettings', function (req, res, next) {console.log («тело уже разобрано», req.body); next();}); ' – generalhenry

+0

Вот пример: http://runnable.com/экспресс/UTlPPF-f2W1TAAET – generalhenry

Смежные вопросы