1

我正在尝试将 JSON 发布到 Node 应用程序,该应用程序将通过 GET 简单地返回它。客户端,我生成模型的 JSON 字符串,并将其 POST 到服务器:

$.post(serverURL, ko.mapping.toJS(viewModel), function(data) {}, "json");

这会产生一个字符串,如下所示:

{"switches":[{"id":1,"name":"Living Room","state":false},{"id":2,"name":"Dining Room","state":false},{"id":3,"name":"Kitchen Room","state":true},{"id":4,"name":"Aviary","state":true}]} 

请注意,“状态”值是不带引号的真/假,这是有效的 JSON。在服务器上,如果我记录请求正文,我会得到以下信息:

{ switches:
[ { id: '1', name: 'Living Room', state: 'false' },
 { id: '2', name: 'Dining Room', state: 'false' },
 { id: '3', name: 'Kitchen Room', state: 'true' },
 { id: '4', name: 'Aviary', state: 'true' } ] }

注意区别:

  • 它引用了真/假值
  • 它有不带引号的对象名称
  • 引号是单引号

我的目标是简单地将原始 JSON 对象存储为其原始字符串格式,以便稍后进行 GET 请求。什么在做这种格式化,我该如何防止它?

每个请求的附加信息

我的 Node.JS 代码如下:

var express = require('express');
var app = express();
var model;

app.configure( function () {});

app.use(express.bodyParser());

app.get('/', function (req,res) {
    res.setHeader('Content-Type', 'application/json');

    console.log(model);
res.send(model);
});

app.post('/', function (req,res) {
    res.header("Access-Control-Allow-Methods", "POST");
    res.setHeader('Content-Type', 'application/json');   

    model = req.body;
    console.log(model);

});

app.listen(3000);
4

2 回答 2

2

我看到几个问题:

您的post电话并没有告诉服务器您要发送什么样的数据。特别是,post( dataType,您为其提供'post')的最后一个参数不是您发送服务器的数据的格式,而是您期望服务器返回的数据的格式。

另外,您正在使用 KnockoutJS 的toJS功能。根据文档,这不会产生 JSON,它会产生 JavaScript 对象图。要获取 JSON 字符串,您需要使用ko.toJSON.

所以我的猜测(就是这样)是 Express 没有足够的信息可以使用,并且正在应用错误的解码机制,并且正在发送的数据被 jQuery 试图将其转换为表单数据而变得有点混乱。

尝试使用ajax函数并指定contentType: "application/json"和使用ko.toJSON,例如:

$.ajax({
  type:       'POST',
  url:         serverURL,
  data:        ko.toJSON(ko.mapping.toJS(viewModel)),
  success:     function(data) {},
  dataType:    'json' // IF you're expecting JSON back
  contentType: 'application/json'
});

(或者可能只是data: ko.toJSON(viewModel),我对淘汰赛的了解还不够深入,无法确定。)

于 2012-11-19T17:30:20.873 回答
0

我认为我遇到了同样的问题,并通过在请求正文上调用 JSON.stringify 来解决它。如果有人有更合适的解决方案,我想听听,因为这似乎有点奇怪。但是OTOH它可以工作8P。

我的控制器产生了这些日志:

------ req.body here ----------
[ { name: 'My Watchlist',
    stocks: [ 'AACC', 'AAPL', 'VZ', 'JPM' ] } ]
------ stringified req.body here ----------
[{"name":"My Watchlist","stocks":["AACC","AAPL","VZ","JPM"]}]
---- end ------

在控制器的开头使用此代码

console.log('------ req.body here ----------');
console.dir(req.body);
console.log('------ stringified req.body here ----------');
console.log(JSON.stringify(req.body));
console.log('---- end ------');

try{
    var o = JSON.parse(JSON.stringify(req.body));
}
catch(e){...
于 2013-01-25T01:17:53.407 回答