使用$ .ajax post将数据发送到node.js服务器

时间:2017-11-05 06:57:00

标签: javascript jquery node.js ajax send

首先,我的问题可能会让你与其他人联系,但我有很多解决方案,但他们没有工作。所以我发布我的问题希望你们能帮助我。!

我创建了两个文件posts.ejs和app.js(在此文件中实现的路由)。

Post.ejs

Ajax调用: -

 function SaveLocalNews(postData, cb) {

        var headerSetting = {
            "api-key": 1,
            "UDID": getUDID(),
            "device-type": getDeviceType(),
            "Authorization": "Authorization"
        };
        var requestMedia = $.ajax({
            url: "/posts",
            type: "POST",
            data: postData,
            dataType: "json",
            cache: false,
            processData: false,
            contentType: false,
            headers: headerSetting
        });

        requestMedia.done(function (data) {
            if (data.status) {
                alert_message("success");
            } else {
                alert_message("fail" + "success");
                // TODO: Handle not uploaded media
            }
            return;
        });
        requestMedia.fail(function (jqXHR, textStatus) {
            // TODO: Handle not uploaded media
            alert_message("fail");
            return
        });

}

App.js

var express = require("express"),
app = express(),
bodyParser = require("body-parser"),
mysql = require("mysql");

var session = require('express-session');

app.set("view engine", "ejs");
app.use(bodyParser.urlencoded({extended: true}));

app.use(express.static(__dirname + '/public'));

app.post("/posts",  function (req, res) {
//I am not getting body/data what I have passed in ajax request. 
    console.log(req.body); // Output:-  {}
});

我希望你能解决我的问题。

1 个答案:

答案 0 :(得分:0)

您似乎需要至少进行一些更改:

在服务器端

添加app.use( bodyParser.json());

在客户端

将您的ajax更新为:

  var requestMedia = $.ajax({
        url: "/posts",
        type: "POST",
        data: JSON.stringify(postData),
        dataType: "json",
        cache: false, 
        contentType: "application/json",
        headers: headerSetting
    });

这些变化的原因

我会将ajax更改为data: JSON.stringify(postData),,而不是使用processData: false,我认为两者基本相同,我个人更喜欢这种方式。

From the docs

  

数据

     

键入:PlainObject或String或Array

     

要发送到服务器的数据。 它被转换为查询字符串, 如果还不是字符串。它附加到GET请求的URL。请参阅processData选项以防止此自动处理。对象必须是键/值对。如果value是一个数组,jQuery会根据传统设置的值使用相同的键序列化多个值(如下所述)。

将您的ajax更改为contentType: 'application/json',,因为false将导致它不设置任何内容类型标头,并可能导致节点无法正确查看帖子正文。

From the docs

  

contentType(默认:' application / x-www-form-urlencoded; charset = UTF-8')

     

类型:布尔值或字符串

     

将数据发送到服务器时,请使用此内容类型。默认为" application / x-www-form-urlencoded; charset = UTF-8",这对大多数情况来说都没问题。如果您明确地将内容类型传递给$ .ajax(),那么它总是被发送到服务器(即使没有数据发送)。从jQuery 1.6开始,你可以传递false来告诉jQuery不要设置任何内容类型标题。

您还希望将dataType: false,更改为dataType: 'json',,因为您已完成的处理程序正在查找data.status,这意味着您实际上希望返回json(即使您的服务器端代码不是似乎还是这样做了)

From the docs

  

dataType(默认值:Intelligent Guess(xml,json,script或html))

     

类型:字符串

     

您期望从服务器返回的数据类型。如果没有指定,jQuery将尝试根据响应的MIME类型推断它(XML MIME类型将产生XML,在1.4 JSON中将产生一个JavaScript对象,在1.4脚本中将执行脚本,其他任何东西将是以字符串形式返回。)

如果您更新为使用JSON.stringify(postData),请移除processData: false,

From the docs

  

processData(默认值:true)

     

类型:布尔值

     

默认情况下,作为对象传入数据选项的数据(技术上,不是字符串)将被处理并转换为查询字符串,适合默认内容类型" application / x- WWW窗体-urlencoded&#34 ;.如果要发送DOMDocument或其他未处理的数据,请将此选项设置为false。