如何使用地理编码器进行地理定位并使用promises保存数据?

时间:2016-03-19 20:20:52

标签: javascript node.js

我正在建立一个更新用户个人资料的PUT功能。通过这样做,我想转换地理位置坐标中的地址,以启用地理位置搜索。

我试图异步执行此操作,但我在使其工作方面遇到了一些麻烦。

这是我的功能:

//PUT: Update profile
app.put('/api/userData', isLoggedInAjax, function(req, res){

    var user = req.user;

    user.profile.username           = req.body.username;
    user.profile.instrument         = req.body.instrument;
    user.profile.location.country   = req.body.country;
    user.profile.location.city      = req.body.city;
    user.profile.location.zip       = req.body.zip;
    user.geolocation                = [];

    var address = req.body.zip +' '+req.body.city +' '+req.body.country;

    nodeGeocoder.geocode(address)
    .then(function(result){
        user.geolocation[0] = result[0].longitude;
        user.geolocation[1] = result[0].latitude;
        return user;

    });


    user.save(function(err){
            if (err) res.send(err);
            res.json({ message: 'profile udated'});
    });
});

2 个答案:

答案 0 :(得分:1)

这是旧的“我如何在JavaScript中进行异步编程”的问题。您必须从回调中调用save函数:

//PUT: Update profile
app.put('/api/userData', isLoggedInAjax, function(req, res){

    var user = req.user;

    user.profile.username           = req.body.username;
    user.profile.instrument         = req.body.instrument;
    user.profile.location.country   = req.body.country;
    user.profile.location.city      = req.body.city;
    user.profile.location.zip       = req.body.zip;
    user.geolocation                = [];

    var address = req.body.zip +' '+req.body.city +' '+req.body.country;

    nodeGeocoder.geocode(address)
    .then(function(result){
        user.geolocation[0] = result[0].longitude;
        user.geolocation[1] = result[0].latitude;

        user.save(function(err){
            if (err) res.send(err);
            res.json({ message: 'profile udated'});
        });
    });
});

答案 1 :(得分:0)

尝试使用console.logs或内置(https://nodejs.org/api/debugger.html)或Webstorm之类的调试器仔细跟踪代码和回调。您需要仔细跟踪执行情况,因为回调和承诺的工作方式令人困惑,直到您真正习惯它为止。

然后,一旦了解了代码执行的顺序,就可以使用promise链中的另一个.then来解决问题,或者将其转换为使用async/await语法并使用babel进行编译。

使用async/await是最直接,最易于理解/可理解的方式,但你可能真的必须学习回调和承诺才能充分利用它。