我正在创建一个基本的功能,允许用户将他们的位置发送到服务器,然后服务器查询数据库并返回他们附近的位置。我使用下面的jquery.ajax包装器将数据发布到服务器。这采用了一个latlon点的形式,然后在mongodb中使用nodejs和express作为geosearch的基础。然后,搜索结果将返回给客户端,并由createMapListings函数呈现。
/find页面最初通过一个get请求通过mongodb呈现给数据库,这与下面的代码是分开的。但是在初始渲染之后,我希望返回依赖于所提供位置的结果。
post方法工作正常,位置被发布到服务器,搜索结果被返回,因为我可以通过控制台日志打印内容。
但是,我想在客户端呈现结果。如前所述,搜索结果在控制台中呈现,但是当我试图传递给客户端时,我可以在输出div中呈现数据本身(以对象数组的形式),但是createMapListings函数似乎没有捕获数据。
实际上,下面的函数似乎被调用了,但是打印出了超过1000行的数据,这些数据应该被捕获,并被描述为“未定义”。我尝试使用res.render和res.redirect,但是在第一种情况下,视图在div中呈现(我想这是预期的),并且重定向失败。
当使用ejs模板向服务器发出简单的get请求(例如,对集合中的所有对象)时,createMapListings函数可以正常工作。但是,我认为这里的问题可能是post请求的组合,然后希望使用完整的回调将结果传递回ajax请求。
如果下面的代码有点迟钝,我深表歉意。我绝对是你所说的初学者。我很感激上面的功能可能是不可能的,所以如果有更好的方法,我当然会对它开放(res.direct也许)。
以下是相关的客户端脚本:

$(document).ready(function(){

$("#geolocate").click(function(){
navigator.geolocation.getCurrentPosition(geolocate, function(){

        });
     });
 });

function geolocate(pos){
     var latlonpt = [];
     var x = pos.coords.latitude;
     var y = pos.coords.longitude;
     latlonpt.push(x);
     latlonpt.push(y);

    var obj = {
    userlocation: latitudelongitudept
    };

   $.ajax({
    url: "/find",
    type: "POST",
    contentType: "application/json",
    processData: false,
    data: JSON.stringify(obj),
    complete: function (data) {
        $('#output').html(data.responseText);
        $('#infooutput').children().remove();
        createMapListings(data.responseText);
        }
     });
 };


 function createMapListings(maps) {
 for (var i = 0; i < maps.length; i++) {
 var url = maps[i]._id;
 var fullurl = "<a href='/show?id=" + url + "'>Route</a></div>";
 var title = "<div>" + maps[i].title + " - " + fullurl +"";
 $('#infooutput').append(title);

     };
  };

 </script>

下面是基本Express应用程序中用于处理上述.ajax包装器发出的POST请求的相关路由。
 exports.findbylocation = function(req, res) {
 console.log(req.body.userlocation);
 var userlocation = req.body.userlocation;
 Map.ensureIndexes;
 Map.find({loc :{ $near : userlocation }}, function(err, maps) {

 if (err) {
          console.log(err)
          }
 else {
       var jmaps = JSON.stringify(maps);
       console.log(jmaps);
       res.send(jmaps);
      }
   });
};

最佳答案

按照惯例,data回调签名中的$.ajax变量名引用解析的http响应体。由于您的回调是在complete上,我们实际上传递了使用的XMLHttpRequest,按惯例称为xhr。您可以正确地获取responseText属性,但这需要解析才能有用。只要我们处理好Content-Type,并且不显式禁用processData,jquery就会为我们进行编码/取消编码—我们只处理对象。这是一件好事,因为传输格式通常对应用程序逻辑并不特别重要。如果我们使用res.json(maps)代替res.send(jmaps),我们可以更简单地编写调用:

$.ajax({
    url:  '/find',
    type: 'POST',
    data: obj,

    success: function(data) {},
    error:   function(xhr, text, err) {}
});

这里的data是一个javascript对象,已经被解析并可以使用。我们还使用默认的application/x-www-form-urlencoded请求,而不是显式地设置contentType。就express而言,这是相同的:它将被urlencoded而不是json解析。

关于javascript - 在 Node js中的.ajax jquery包装器中从POST请求中呈现mongodb数据库结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12637592/

10-11 09:30
查看更多