我目前一直从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
是某人的保留词;从key
到identifier
进行全球性的,经过手工检查的搜索和替换似乎不会明显改变行为。
所以有两个问题,按优先顺序排列:
1:如何发送和接收将被解释为将内容放入GET或POST查询字符串中的变量,或者将它们取出的变量? request.query表示的[Object object]
是什么?
2:如果那不是要采取的路径,我应该只使用JSON,那么在这个确切的上下文中我应该知道什么(如果有的话)JSON编码?它是否像JSON一样简单,或者是否有我应该被告知的事情?
谢谢,
答案 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)