获得帖子的有效载荷

时间:2013-03-18 22:58:58

标签: node.js jquery

我已经使用jQuery将ajax发布到nodejs webserver上。

网络服务器代码接收帖子,但我不知道如何检索有效负载,而nodejs文档网站很糟糕。我已经尝试将请求对象转储到调试器控制台,但我无法在那里看到数据。如何访问帖子的有效负载?

文档说请求对象是http.IncomingMessage的一个实例,并使用签名data公开function (chunk) { }事件,其中chunk是字符串或Buffer,但是如果您不知道应该在何处或如何与此事件挂钩,或者如何使用缓冲区,那么这不是非常有用。


我注意到在“社区”而不是“文档”链接下隐藏了第二个更具叙述性的手册。这很好。它目前无法使用。这不太好。


我被问到我是使用框架还是尝试“本机”。无知阻止我直接回答,所以这里是代码

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的成功函数的开头。它看起来像这样工作,我想这意味着在听众之前调用成功函数。如果这是正确的绑定位置,那么有人请告诉我。

1 个答案:

答案 0 :(得分:3)

在“// PROCESS POST HERE”处添加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');
});

哦,至于'本机或模块'问题,你可以使用像express这样的模块来解析你的身体,并用结果填充req.body(跳过addListener痛苦,甚至解析formdata或json for您)。见http://expressjs.com/api.html#req.body