将数据从服务器(Node.js)发送到客户端(Ajax请求)。

3

如何使用Node.js从服务器向客户端发送数据?

基本上,我通过点击按钮来调用此函数。

javascript

function createStuff(tid) {
    $.ajax({
        type: "POST",
        url: '/create/',
        data: {tid: tid}
        success: function(id) {
            doStuff(id);
        },
        error: function(jqXHR, textstatus, errorThrown) {
            alert('text status ' + textstatus + ', err ' + errorThrown);
        }
    });
};

这个过程处理请求。服务器。
exports.create = function(req, res) {
    new Stuff({
        content: "random stuff"
    }).save(function(err, stuff) {
        Otherstuff.update({_id: req.body.tid}, {$push: {stuffes: stuff}}, {upsert: true}, function(err, mvar) {
            res.redirect(301, '/' + req.body.tid);
        });
    });
};

但是我需要在res.redirect中发送新创建的stuff._id。问题是,我不想像res.redirect(301,'/' + req.body.tid + '/' + stuff._id)那样发送它,因为我将不得不创建一个全新的路由器,这似乎不太灵活。而且当我发出这个请求时,网页不会重新加载,这正是我想要的。

我尝试使用res.send(stuff._id),但我只能做一次(因为连接似乎在此之后关闭)。我正在使用以下库:mongoose、jquery、express

1个回答

7
如果我理解正确的话,您希望在回复客户端时将请求中原始ID和新生成的ID一起返回。但我不太清楚,如果您不想进行任何页面重新加载,为什么要使用“重定向”呢?
您可以简单地:
var obj = {
    tid: req.body.tid,
    _id: stuff._id
};

res.send(JSON.stringify(obj));

而且,ajax的成功处理程序应该是:

success: function(data) {
    var obj = JSON.parse(data);
    var id = obj._id;
    doStuff(id);
}

我想这就是你想要的。
编辑:
正如deitch指出的那样,express本身将对象转换为JSON字符串,并添加Content-Type头,以便JQuery正确识别和解析字符串为JSON对象。因此不需要对数据进行stringify和parse。

是的,这正是我想要的!我是一个node.js新手(以及服务器端编程),所以我一直在每个路由器的末尾使用重定向(尽管即使使用重定向,当我动态添加内容时客户端未更新)因为我认为我需要在每个路由器的末尾有某种响应。如果我不需要发送任何东西,那么我只需要使用res.end();而不是res.redirect或res.send吗? - Samir Alajmovic
1
很高兴知道它有帮助... :) - Salman
1
如果你正在使用express,甚至不需要JSON.stringify(obj),它会自动为你完成,只需res.send({a:1,b:2})。同样地,jQuery也会在客户端自动转换数据类型。 - deitch
@deitch 我认为只有在使用getJSON()或在请求中添加dataType: 'json'时,JQuery才会进行转换。 - Salman
@deitch 刚刚检查了一下,它可以运行。正在更新答案。谢谢。 :) - Salman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接