我正在创建一个基本的功能,允许用户将他们的位置发送到服务器,然后服务器查询数据库并返回他们附近的位置。我使用下面的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/