node.js - 谷歌地图 api 多标记 mongodb pug/jade

标签 node.js mongodb google-maps express pug

我正在尝试用我的 mongodb 集合显示 map 位置,问题是只能从 mongodb 访问一个数据,试图从服务器端和客户端客户端循环以显示数据但失败了。这里的代码:

来自 https://gist.github.com/parth1020/4481893 的示例代码

script(type='text/javascript').
        var locations = [
            ['Bondi Beach', -33.890542, 151.274856, 4],
            ['Coogee Beach', -33.923036, 151.259052, 5],
            ['Cronulla Beach', -34.028249, 151.157507, 3],
            ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
            ['Maroubra Beach', -33.950198, 151.259302, 1]
        ];
        var map = new google.maps.Map(document.getElementById('map'), {
            zoom: 10,
            center: new google.maps.LatLng(-6.2674807,106.8066466),
            mapTypeId: google.maps.MapTypeId.ROADMAP
        });
        var infowindow = new google.maps.InfoWindow();
        var marker, i;
        for (i = 0; i < locations.length; i++) {
            marker = new google.maps.Marker({
                position: new google.maps.LatLng(locations[i][1], locations[i][2]),
                map: map
            });
            google.maps.event.addListener(marker, 'click', (function (marker, i) {
                return function () {
                    infowindow.setContent('<h3>' + '#{egstation.loc}'+ '</h3>\n' +
                        '<p>Navigasi</p>');
                    infowindow.open(map, marker);
                }
            })(marker, i));
        }

没有循环:成功

express :

router.get('/', auth.check_login, function(req, res, next) {
    session_store = req.session;
    Egstation.find(function(err, data){
        if (err) throw err;
        console.log(data);
        res.render('index', {
            title: 'EGShare | Energy Sharing Platform',
            session_store:session_store,
            egstation: data
        });
    }).select('name lat lng loc');
});

console.log(数据)的输出:

{
    "_id" : ObjectId("58b78132c44b37103cc54180"),
    "name" : "egstation 1",
    "lat" : -6.2674807,
    "lng" : 106.8066466,
    "loc" : "Makedonia MakerSpace Jalan Pangeran Antasari No.44 RT.7 RW.7",
    "__v" : 0
}
{
    "_id" : ObjectId("58bd564b4bf9ea905c53ee72"),
    "name" : "egstation 2",
    "lat" : -5.2345634,
    "lng" : 124.2453456,
    "loc" : "Ngasal"
}

我的 index.pug

script(type='text/javascript').
    var locations = [
        ['Bondi Beach', -33.890542, 151.274856, 4],
        ['Coogee Beach', -33.923036, 151.259052, 5],
        ['Cronulla Beach', -34.028249, 151.157507, 3],
        ['Manly Beach', -33.80010128657071, 151.28747820854187, 2],
        ['Maroubra Beach', -33.950198, 151.259302, 1]
    ];
    var map = new google.maps.Map(document.getElementById('map'), {
        zoom: 10,
        center: new google.maps.LatLng(-6.2674807,106.8066466),
        mapTypeId: google.maps.MapTypeId.ROADMAP
    });
    var infowindow = new google.maps.InfoWindow();
    var marker, i;
    for (i = 0; i < locations.length; i++) {
        marker = new google.maps.Marker({
            position: new google.maps.LatLng('#{egstation[0].lat}', '#{egstation[0].lng}'),
            map: map
        });
        google.maps.event.addListener(marker, 'click', (function (marker, i) {
            return function () {
                infowindow.setContent('<h3>' + '#{egstation[0].loc}'+ '</h3>\n' +
                    '<p>Navigasi</p>');
                infowindow.open(map, marker);
            }
        })(marker, i));
    }

客户端循环不工作

for (i = 0; i < '#{egstation.length}'; i++) {
    marker = new google.maps.Marker({
        position: new google.maps.LatLng('#{egstation[i].lat}', '#{egstation[i].lng}'),
        map: map
    });
    google.maps.event.addListener(marker, 'click', (function (marker, i) {
        return function () {
            infowindow.setContent('<h3>' + '#{egstation[i].loc}'+ '</h3>\n' +
                '<p>Navigasi</p>');
            infowindow.open(map, marker);
        }
    })(marker, i));
}

错误输出

TypeError: /home/mda/WebstormProjects/egsharev/views/index.pug:265
    263|         for (i = 0; i < '#{egstation.length}'; i++) {
    264|             marker = new google.maps.Marker({
  > 265|                 position: new google.maps.LatLng('#{egstation[i].lat}', '#{egstation[i].lng}'),
    266|                 map: map
    267|             });
    268|             google.maps.event.addListener(marker, 'click', (function (marker, i) {

Cannot read property 'lat' of undefined

服务器端的循环也行不通

router.get('/', auth.check_login, function(req, res, next) {
    session_store = req.session;
    Egstation.find(function(err, data){
        if (err) throw err;
        for (var i = 0; i < data.length; i++){
            egstation.name = data[i].name;
            egstation.lat = data[i].lat;
            egstation.lng = data[i].lng;
            egstation.loc = data[i].loc;
            res.render('index', {
                title: 'EGShare | Energy Sharing Platform',
                session_store:session_store,
                egstation: egstation
            });
        }

    }).select('name lat lng loc');
});

帮帮我,谢谢。

最佳答案

我更喜欢区分我的服务器端代码和前端代码。 Jade/PUG 可以很好地循环 HTML 代码。 但不要循环 Javascript 变量。 更好的是你的服务器端代码只渲染 View 而不传递任何数据。 客户端将请求另一个具有 JSON 响应的数据,以便于 JavaScript 读取。

[更新] 也许您的问题与此处相同:http://you.arenot.me/2010/06/29/google-maps-api-v3-0-multiple-markers-multiple-infowindows/

关于node.js - 谷歌地图 api 多标记 mongodb pug/jade,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42628768/

相关文章:

java - 带有 $in 和 upsert 的 MongoDB UpdateMany

mongodb - mongodb 中的 GroupBy DayOfMonth 但项目完成日期

javascript - Android Google map 应用与使用 Android WebView 查看网页中嵌入的 Google map

mysql - 使用node-mysql从每个结果执行附加查询

node.js - 如何在 package.json 中仅针对 POST 请求设置代理?

node.js - Mongoose : sort by math and search by multiple values in string array

google-maps - 如何去除谷歌地图自动完成下拉列表中的 "Powered by Google"标识?

google-maps - 如何获取特定 map 的动态谷歌地图网址(我有静态 map 网址)

javascript - Webpacking jQuery 和自定义文件 : jQuery is undefined

node.js - 为什么我的 fork 子进程在 fork 后立即退出?