-1

我一直在寻找几天的答案,但似乎没有任何效果。我对 node.js 有点陌生,我只在服务器端工作以从客户端回答 POST。这有点像我必须做的任务。我需要做的是,当我没有编写的客户端脚本在位置“/sort”使用参数发出 POST 请求时theArray,我需要对数组进行排序,删除所有非字符串值并将结果值作为 JSON 返回。客户端脚本将在字符串化 JSON 数组中发送 Array 参数。所以像这样

{"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;

替换formParamName为 POST 表单中使用的实际名称。这是查询字符串模块文档

于 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 回答