Javascript 从Node.js发布到PHP

Javascript 从Node.js发布到PHP,javascript,php,node.js,post,express,Javascript,Php,Node.js,Post,Express,我试图将Node.js应用程序中的一些数据发布到PHP脚本中。目前,我只是建立一个概念证明,但我无法将实际数据传递到PHP端。请求通过了,我得到了200,但是PHP认为$\u POST数组是空的 这是我的节点代码: // simple end point just for testing exports.testPost = function(request, response) { data = request.body.data; postToPHP(data);

我试图将Node.js应用程序中的一些数据发布到PHP脚本中。目前,我只是建立一个概念证明,但我无法将实际数据传递到PHP端。请求通过了,我得到了200,但是PHP认为$\u POST数组是空的

这是我的节点代码:

// simple end point just for testing

exports.testPost = function(request, response) {
    data = request.body.data;

    postToPHP(data);

    response.end(data);
}

function postToPHP (data) {
    var http = require('http');

    var options = {
        host : 'localhost',
        port : 8050,
        path : '/machines/test/index.php',
        method : 'POST',
        headers : {
            'Content-Type' : 'application/json',
            'Content-Length' : Buffer.byteLength(data)
        }
    };

    var buffer = "";

    var reqPost = http.request(options, function(res) {
        console.log("statusCode: ", res.statusCode);

        res.on('data', function(d) {
            console.info('POST Result:\n');
            //process.stdout.write(d);
            buffer = buffer+data;
            console.info('\n\nPOST completed');

        });

        res.on('end', function() {
            console.log(buffer);
        });
    });

    console.log("before write: "+data);

    reqPost.write(data);
    reqPost.end();

}
同样,请求将其发送到localhost:8050/machines/test/index.php,但当我执行$u POST的var_转储时,它是一个空数组

[29-Jan-2014 21:12:44] array(0) {

}
我怀疑.write()方法有问题,但我不太清楚是什么原因。如果您对我遗漏的内容或错误的操作有任何意见,我们将不胜感激

*更新:


正如一些注释所指出的,使用file\u get\u内容('php://input'); 确实可以在PHP端获取数据,但我仍然希望能够直接访问$\u POST数组

由于您使用
Content-Type:application/json
发送数据,您需要读取原始输入,因为php不知道如何将json读入其全局变量(如_GET和_POST),除非您有一些php扩展插件可以这样做

您可以使用库将对象解析为名称-值对查询字符串,然后使用
内容类型:application/x-www-form-urlencoded
传输该字符串,以便将数据解析为全局值

var data = {
   var1:"something",
   var2:"something else"
};
var querystring = require("querystring");
var qs = querystring.stringify(data);
var qslength = qs.length;
var options = {
    hostname: "example.com",
    port: 80,
    path: "some.php",
    method: 'POST',
    headers:{
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': qslength
    }
};

var buffer = "";
var req = http.request(options, function(res) {
    res.on('data', function (chunk) {
       buffer+=chunk;
    });
    res.on('end', function() {
        console.log(buffer);
    });
});

req.write(qs);
req.end();

可能是@Quentin的复制品不,绝对不是。我尝试过将非JSON传递给PHP,但它仍然是一个空的$\u POST数组。“非JSON”应用程序/x-www-form-urlencoded数据是否正确编码?您只向我们展示了不应该填充
$\u POST
@Quentin的代码为什么不填充$\u POST?我相信答案就是我正在寻找的答案。我也尝试了内置的查询字符串模块来创建一个正确编码的字符串,但是$\u POST仍然是空的。我错过了什么?(顺便说一句,感谢您的及时回复!)您需要从php读取原始输入:
file\u get\u contents(“php://input");如何调整此解决方案以处理传入数据,例如:“[{”name:“test1”,“value:“10”},{”name:“test2”,“value:“20”}]”?由于明显的原因,我无法让qs助手将其字符串化。@NicholasKreidberg,如果您指的是来自php的数据
JSON.parse(buffer)
,否则如果您指的是变量数据包含该字符串,则只需先将其解析为对象
data={myArray:JSON.parse(data)}$\u POST['myArray']
之前,这非常有用!要使同一个示例在HTTPS上工作,需要什么?我最终使用了“请求”模块,并且在HTTPS上工作得很好。我仍然对如何使用本机模块感到好奇,但就目前而言,功能正是我所需要的。再次感谢!工作得很好,虽然在一个妥协的方式!