Ajax 帖子的成功部分无法在完整日历代码中运行

Posted

技术标签:

【中文标题】Ajax 帖子的成功部分无法在完整日历代码中运行【英文标题】:Success part of Ajax post not working in fullcalendar code 【发布时间】:2019-11-06 16:54:42 【问题描述】:

在我的代码中,ajax post 方法的成功部分不起作用,我不知道为什么。这个 ajax 调用是通过 jquery 的 fullcalendar 函数的一部分。

ajax 请求将数据发送到 post 路由,并将其用于数据库 cal (mysql)。数据的传递和相应的 sql 查询工作正常,但 ajax 调用的成功部分不起作用(由缺少 console.log 输出证明)

下面是ajax调用的代码:

        $.ajax(
         url:"/insertEventsIntoDirectorInput",
         type:"POST",
         data:title:title, start:start, end:end, urlPath: window.location.href.match(/\/([^/]*)$/)[1],
         success:function()
         
            console.log('insert success function started');
          calendar.fullCalendar('refetchEvents');
          alert("Added Successfully");
         
        )

以下是发布路线的代码:

router.post('/insertEventsIntoDirectorInput', function (req, res) 
    if (req.body.title) 
        var urlVariable = req.body.urlPath;
        console.log(urlVariable);
        console.log(typeof urlVariable);
        var title = req.body.title;
        var start = req.body.start;
        var end = req.body.end;

        dbjsMethods.geteIDFromDirectorInputForm(urlVariable, function(eID) 
            console.log(eID);
            console.log(typeof eID);
            dbjsMethods.insertEventsInDirectorInput(eID[0].eID,title,start,end);
        )
        console.log(res);
       
);

以下是 sql 查询的代码(通过 node.js):

    geteIDFromDirectorInputForm: function (url, callback) 
        console.log('geteID function started');
        console.log(url);
        conn.query(`SELECT eID FROM directoravailabilitiesinputform where url = ?`, [url],
        function (err, results, fields) 
            if (err) throw err;
            console.log(results);
            return callback(results);
        );
    ,

    insertEventsInDirectorInput: function (eID,title,start,end) 
        console.log('insert function started');
        console.log(typeof eID);
        conn.query('insert into directorinputevents(eID,title,start,end) values ("' +eID+ '","' +title+ '","' +start+ '","' + end + '")',
            function (err, results, fields) 
                if (err) throw err;
                else console.log('Updated ' + results.affectedRows + ' row(s).');
            );
    ,

当我运行该函数时,我希望有“插入成功函数已启动”的输出,如代码的第一位中的 console.log 所示,但这是不存在的。

【问题讨论】:

【参考方案1】:

服务器上的.post() 处理程序未发送响应。客户端仍在等待服务器的回复。您需要始终从服务器发回响应。

router.post('/insertEventsIntoDirectorInput', function (req, res) 
    if (req.body.title) 
        var urlVariable = req.body.urlPath;
        console.log(urlVariable);
        console.log(typeof urlVariable);
        var title = req.body.title;
        var start = req.body.start;
        var end = req.body.end;

        dbjsMethods.geteIDFromDirectorInputForm(urlVariable, function(eID) 
            console.log(eID);
            console.log(typeof eID);
            dbjsMethods.insertEventsInDirectorInput(eID[0].eID,title,start,end);
            res.sendStatus(200);
        )
        console.log(res);
     else 
        res.sendStatus(500);
      
);

在这里我插入了res.sendStatus(xxx),因为它看起来不像客户端期望从请求中返回任何数据,所以这只是将状态代码发送回来,没有数据。


仅供参考,您还需要修复您的 geteIDFromDirectorInputForm() 方法以正确返回错误。

geteIDFromDirectorInputForm: function (url, callback) 
    console.log('geteID function started');
    console.log(url);
    conn.query(`SELECT eID FROM directoravailabilitiesinputform where url = ?`, [url],
    function (err, results, fields) 
        if (err) 
            callback(err);
         else 
            console.log(results);
            callback(null, results);
        
    );
,

然后,更改调用代码以查看该错误:

router.post('/insertEventsIntoDirectorInput', function(req, res) 
    if (req.body.title) 
        var urlVariable = req.body.urlPath;
        console.log(urlVariable);
        console.log(typeof urlVariable);
        var title = req.body.title;
        var start = req.body.start;
        var end = req.body.end;

        dbjsMethods.geteIDFromDirectorInputForm(urlVariable, function(err, eID) 
            if (err) 
                console.log(err);
                res.sendStatus(500);
             else 
                console.log(eID);
                console.log(typeof eID);

                dbjsMethods.insertEventsInDirectorInput(eID[0].eID, title, start, end);
                res.sendStatus(200);
            
        );
     else 
        res.sendStatus(500);
    
);

【讨论】:

以上是关于Ajax 帖子的成功部分无法在完整日历代码中运行的主要内容,如果未能解决你的问题,请参考以下文章

如何在从父视图过滤时重新渲染完整日历

使用Ajax在完整日历上显示数据不显示记录

Rails Ajax - 渲染不同的部分

使用 HttpResponseMessage 401 在 ajax 帖子上总是成功

Ajax POST 返回 Bootstrap 面板主体内的完整部分视图

如何在 postlistview 和 postdetailview 中使用 ajax