如何在Express.js中处理POST数据?

时间:2015-07-14 16:42:34

标签: javascript jquery ajax json express

我目前一直从Express.js得到500个错误,我认为这些错误取决于无法获得请求所依赖的字符串键。

在客户端,我有几个请求命中同一点(/restore),所有这些请求都是为了在jQuery.ajax()调用的data字典中使“key”成为一个字段,包括在主词典中。在客户端,我有以下内容,其中包括我认为不太特别相关的localStorage后备:

var restore = function(key, default_value, state, callback)
  {
  populate_state(state, default_value);
  state.initialized = false;
  var complete = function(jqxhr)
    {
    if (jqxhr.responseText === 'undefined')
      {
      }
    else
      {
      populate_state(state, JSON.parse(jqxhr.responseText));
      }
    callback();
    state.initialized = true;
    }
  jQuery.ajax('/restore',
    {
    'complete': complete,
    'data':
      {
      'key': key,
      'userid': userid
      },
    'method': 'POST',
    });
  if (Modernizr.localstorage)
    {
    if (localStorage[key] === null || localStorage[key]
      === undefined)
      {
      return default_value;
      }
    else
      {
      return JSON.parse(localStorage[key]);
      }
    }
  else
    {
    return default_value;
    }
  }

  restore('Calendar', default_value,
    default_value, function()
    {
    jQuery('#submit-calendar').prop('disabled', false);
    });

    restore('Scratchpad', '', result, function()
      {
      for(var instance in CKEDITOR.instances)
        {
        if (CKEDITOR.instances[instance])
          {
          CKEDITOR.instances[instance].setReadOnly(false);
          }
        }
      });

    return restore('Todo', {
      'items': [],
      'text': ''
      },
      {
      'items': [],
      'text': ''
      },
      function()
        {
        jQuery('#add-activity-button').prop('disabled', false);
        jQuery('#todo-new-entries').prop('disabled', false);
        });

  return restore('YouPick', {
    start_time: new Date().getTime()
    },
    {
    start_time: new Date().getTime()
    },
    function()
      {
      });

请注意,每次调用restore()都会明确指定键的非空,唯一,字母字符串作为第一个参数。

在服务器端,Express的routes / index.js有一个为请求提供服务的视图:

router.post('/restore', function(request, response, next)
  {
  console.log('router.post /restore');
  console.log('Query: ' + request.query);
  console.log('href: ' + sanitize(request.user.href));
  console.log('key: ' + sanitize(request.query.key));
  var result = look_up_key(request.user.href, request.query.key);
  console.log(result);
  response.type('application/json');
  response.send(result);
  });

清理功能会清除非字母数字或明确枚举的标点字符的字符。它应该没有纯字母键的请求。

通过多次调用,它具有/ bin / www的输出:

router.post /restore
Query: [object Object]
href: httpsapi.stormpath.comv1accounts**********************
POST /restore 500 39.516 ms - 1210
router.post /restore
Query: [object Object]
href: httpsapi.stormpath.comv1accounts**********************
POST /restore 500 5.000 ms - 1210
router.post /restore
Query: [object Object]
href: httpsapi.stormpath.comv1accounts**********************
POST /restore 500 5.842 ms - 1210

看起来查询有什么东西,但我在哪里可以访问它? http://expressjs.com/api.html似乎我应该能够将它视为字典,但在服务器端console.log()调用中,console.log('key: ' + sanitize(request.query.key));似乎不会产生任何输出,即使是空的或损坏的键。它似乎在那里崩溃,显然从那里发送了500.

我可能,或者至少可能通过将数据编码和解码为JSON来解决问题,虽然我认为这通常是一个成功的解决方案,但我想理解为什么这不起作用。

我也不认为key是某人的保留词;从keyidentifier进行全球性的,经过手工检查的搜索和替换似乎不会明显改变行为。

所以有两个问题,按优先顺序排列:

1:如何发送和接收将被解释为将内容放入GET或POST查询字符串中的变量,或者将它们取出的变量? request.query表示的[Object object]是什么?

2:如果那不是要采取的路径,我应该只使用JSON,那么在这个确切的上下文中我应该知道什么(如果有的话)JSON编码?它是否像JSON一样简单,或者是否有我应该被告知的事情?

谢谢,

1 个答案:

答案 0 :(得分:0)

POST个请求,数据通常在请求正文中传递,这意味着您需要使用req.body而不是req.query(后者用于访问传入的数据) URL的查询字符串)。在req.body开始工作之前,您需要包含body-parser中间件。

至于记录[object Object]的原因:这与字符串化有关。您的日志命令使用+来“添加”字符串和对象(request.query),它将使用对象的字符串表示形式,恰好是[object Object]。

相反,您应该将对象作为单独的参数传递给console.log()

console.log('Query: ', request.query); // comma instead of plus

这将显示对象的更精细的字符串表示。或者,您甚至可以将其打印为JSON:

console.log('Query: %j', request.query)