-1

私はこれに対する答えを数日間探していましたが、何もうまくいかないようです。私はnode.jsを初めて使用し、クライアント側からPOSTに応答するためにサーバー側のみに取り組んでいます。これは私がしなければならない課題のようなものです。私がしなければならないことは、私が書いていないクライアント スクリプトが、場所 '/sort' でパラメータを使用して POST 要求を行うときですtheArray。配列を並べ替えて、文字列以外の値をすべて削除し、結果の値を JSON として返す必要があります。クライアント スクリプトは、文字列化された JSON 配列で theArray パラメータを送信します。だから、このようなもの

{"theArray":"[[],\"d\",\"B\",{},\"b\",12,\"A\",\"c\"]"}.

ここでこのコードを試しました:

case '/sort':
        if (req.method == 'POST') {
            res.writeHead(200,{
                'Content-Type': 'application/json'
            });
            var fullArr = "";
                req.on('data', function(chunk) {
                    fullArr += chunk;
                    });
                req.on('end', function() {
                            var jPar = JSON.parse(fullArr);
                            var arr = "";
                            var par = jPar.theArray;
                            arr += par;

                                function censor(key, value) {
                                    if (typeof value == "string") {
                                            return value;
                                        } 
                                        return undefined;
                                        }
                        var jsonString = JSON.stringify(par, censor);
                        console.log(jsonString);
                });         
                    res.end();


        };

break;

しかし、これはエラーで返されます:

undefined:1
%2C%22A%22C%22
^
SyntaxError: Unexpected token h
    at Object.parse (native) ...

誰かが私を助けてくれませんか。助けになるコードを教えてください。ありがとう

4

2 に答える 2

1

トランスポートエンコーディングに従ってPOSTデータをデコードする必要があります(あなたの場合はapplication/x-www-form-urlencodedだと思います)

var json = require('querystring').parse(fullArr).formParamName;

formParamNamePOST フォームで使用される実際の名前に置き換えます。ここにクエリ文字列モジュールのドキュメントがあります

于 2012-08-09T04:31:16.397 に答える
0
function parseBody (req, callback) {
  var buffer = '';
  req.on('data', function(chunk) {
    buffer += chunk;
  });
  req.on('end', function() {
    try {
      callback(null, JSON.parse(buffer));
    } catch(e) {
      callback(e);
    }
  });
}

function stringFilter(element) {
  return typeof element === 'string';
}

function requestHandler (req, res) {
  parseBody(req, function(err, body) {
    if(err) {
      res.writeHead(400, {
        'Content-Type': 'application/json'
      });
      return res.end(err.toString());
    }

    res.writeHead(200,{
      'Content-Type': 'application/json'
    });

    var result = body.theArray.filter(stringFilter).sort();

    res.end(JSON.stringify(result));
  });
}

require('http').createServer(requestHandler).listen(3000);

URL の処理を​​省略しました。これは、本文を解析し、文字列以外を除外するためのものであり、sort().

これをテストできます(ファイルに名前を付ける場合app.js):

node app.js

curl -H "Content-Type: application/json" -d '{"theArray": [[], "a", {}, "c", "B"]}' localhost:3000

編集:ただし、これには入力 (リクエスト本文) が有効な JSON である必要があります。質問のデータのように見える場合は、その形式のパーサーを作成する必要があります。私には、誰かがそのような配列を持っていたようです

var arr = [[],"d","B",{},"b",12,"A","c"];

そして、やった

JSON.stringify({theArray: JSON.stringify(arr)});
于 2012-08-09T11:19:56.900 に答える