1

JSONをNodeアプリにPOSTしようとしています。これにより、GETを介してJSONが返されます。クライアント側では、モデルの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}]} 

「状態」の値は引用符で囲まれていないtrue/falseであることに注意してください。これは、有効な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' } ] }

違いに注意してください。

  • 真/偽の値を引用しています
  • 引用符で囲まれていないオブジェクト名があります
  • 引用符は一重引用符です

私の目標は、後でGETリクエストを行うために、元のJSONオブジェクトを元の文字列形式で保存することです。このフォーマットは何をしているのですか、どうすればそれを防ぐことができますか?

リクエストごとの追加情報

私の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 に答える