【问题标题】:Ajax post response returns empy objectAjax 发布响应返回空对象
【发布时间】:2018-09-09 20:49:32
【问题描述】:

我最近开始使用 Node.js 和 jQuery,但我不知道我的项目出了什么问题。 我有一个向节点 js 服务器发送发布请求的客户端应用程序;该服务器从帖子中获取数据并执行查询;最后,它应该向客户端发送一个包含从先前查询中检索到的信息的 json。问题是节点 js 发送的响应是一个空对象( {} ),我不知道为什么。 这是我的源代码:

节点 JS:

var http = require("http");
var url = require('url');
var querystring = require('querystring');
var express = require('express');
var cookieParser = require('cookie-parser');
var mysql = require('mysql');


var con = mysql.createConnection({
    host: "",
    user: "",
    password: "",
    database : ''
});


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


app.post('/search',function(req, res) {
    if (req.method == 'POST') { //PUT Only
        var body = '';
        req.on('data', function (data){body += data;});
        req.on('end', function () {
            var post = querystring.parse(body);
            console.log("Dati in ingresso > " + JSON.stringify(post));
            //res.writeHead(200, {'Content-Type': 'text/plain'})
            query("SELECT Nome FROM Mood WHERE Nome LIKE \'" + post.data  + "%\'",res);
        });
    }else{
        console.log("Not POST request")
        res.end();
    }
});

var query = function(q,res) {
    var results = {};

    con.query(q, function (err, result, fields) {
        if (err) throw err;
        results = JSON.stringify(JSON.parse(JSON.stringify(result))[0].Nome);
        console.log("Risultati query: ");
        console.log(results);
    });
    res.json(results);
    res.end();
}
app.listen(8888);

客户:

$("document").ready(function () {
    $('#search-box').on('input propertychange', function(e){
        var input = $(this).val();
        var array = ['prova1','prova2','prova3'];
        var ul = $('#results-options ul');

        $.ajax({
            type: "POST",
            url: "/search",
            data: {data : input},
            contentType: "application/json",
            success: function(d) {
                console.log(d);
                console.log(JSON.stringify(d));
                console.log(JSON.parse(d));
            },
            error: function(d) {
                console.log("Error");
            }
        });

        $('#results-options').show();
    });
    $("#results-options").on('click',function (e) {
        $('this').show();
        e.stopPropagation();
    })
    $(document).on('click', function(){
        $('#results-options').hide();
    })
});

【问题讨论】:

  • 因为您在异步调用中返回/设置之前使用结果。
  • 尝试将res.json(results); res.end(); 放入con.query() 调用的回调中。
  • 另外,快速提问——// PUT only 在.post() 监听器中的目的是什么?你真的不需要在那里检查请求类型。
  • 非常感谢!有效。必须删除请求类型的检查

标签: javascript jquery node.js ajax express


【解决方案1】:

如上所述,您的query 函数在对数据库的查询完成之前发送回响应。这就是为什么它会空着回来。我在数据库查询的回调中移动了res.json(results); res.end(); 代码。

var query = function(q,res) {
    var results = {};

    con.query(q, function (err, result, fields) {
        if (err) throw err;
        results = JSON.stringify(JSON.parse(JSON.stringify(result))[0].Nome);
        console.log("Risultati query: ");
        console.log(results);

        // I moved the code here
        res.json(results);
        res.end();
    });
    // Your old code
    // res.json(results);
    // res.end();
};

【讨论】:

    猜你喜欢
    • 2015-07-01
    • 2018-06-08
    • 2013-03-10
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多