2017-01-10 4 views
0

У меня есть модуль, который я написал сам. Он содержит 3 функции, которые я называю цепными обещаниями. Последний не выполняется, и я не могу понять, почему.Узел JS - функция не выполнена

Модуль geodata.js

require('use-strict'); 
 
var Promise = require('promise'); 
 
var NodeGeocoder = require('node-geocoder'); 
 
var mongoose = require('mongoose'); 
 
var User = require('../models/user'); 
 

 
var options = { 
 
    provider: 'google', 
 
    httpAdapter: 'https', 
 
    apiKey: 'AIzaSyA4v81WbNOMeRL7p911Mxr6PBZnidX0cIM', 
 
    formatter: null 
 
}; 
 

 
module.exports = { 
 

 
    //******************************************************* 
 
    // Find user and return his adress (street + town) 
 
    // 
 
    //******************************************************* 
 
    findUser: function(username) { 
 
     return new Promise(function(resolve, reject) { 
 
      User.findOne({ 
 
       'username': username 
 
      }, function(err, doc) { 
 
       if (!err) { 
 
        resolve(doc); 
 
       } else { 
 
        reject(err); 
 
       } 
 
      }); 
 
     }); 
 
    }, 
 
    //******************************************************* 
 
    // Fetch geodata (latitude + longitude) to users record in 
 
    // the user collection. 
 
    //******************************************************* 
 
    fetchGeoData: function(userObj) { 
 
     return new Promise(function(resolve, reject) { 
 
      var geocoder = NodeGeocoder(options); 
 
      var adress = userObj.street + ' ' + userObj.town; 
 
      geocoder.geocode(adress, function(err, res) { 
 
       if (!err) { 
 
        var res2 = { 
 
         'username': userObj.username 
 
        } 
 
        console.log(res); 
 
        resolve([res, res2]); 
 
       } else { 
 
        reject(err); 
 
       } 
 
      }); 
 
     }); 
 
    }, 
 
    //******************************************************* 
 
    // Fetch geodata (latitude + longitude) to users record in 
 
    // the user collection. 
 
    //******************************************************* 
 
    addGeoData: function(message) { 
 
     return new Promise(function(resolve, reject) { 
 
      User.findOne({ 
 
       'username': message.username 
 
      }, function(err, doc) { 
 
       console.log(doc); 
 
       if (err) { 
 
        console.log(err); 
 
        reject(err); 
 
       } 
 
       if (!doc) { 
 
        console.log('User not found.'); 
 
        reject('User not found.'); 
 
       } 
 
       doc.longitude = String(message.longitude); 
 
       doc.latitude = String(message.latitude); 
 
       doc.save(); 
 
       resolve(doc); 
 
      }); 
 
     }); 
 
    }, 
 

 
    fixJSON: function(inpJSON) { 
 
     var strung = JSON.stringify(inpJSON); 
 
     obj = strung.substring(1, strung.length - 1); 
 
     return (JSON.parse(obj)); 
 
    } 
 

 
};

.. и вот вызывающий сценарий:

require('use-strict'); 
 

 
var mongoose = require('mongoose'); 
 
var dbConfig = require('./db'); 
 
var geodata = require('./lib/geodata.js'); 
 

 
// Connect to DB 
 
mongoose.connect(dbConfig.url, { 
 
    auth: { 
 
     authdb: "admin" 
 
    } 
 
}); 
 
mongoose.set('debug', true); 
 

 
geodata.findUser('jimmy').then(function(result) { 
 
     console.log('findUser() done'); 
 
     return geodata.fetchGeoData(result); 
 
    }).then(function(result) { 
 
     console.log('fetchGeoData() done'); 
 
     var res1Fixed = geodata.fixJSON(result[0]); 
 
     var params = { 
 
      username: result[1].username, 
 
      longitude: res1Fixed.longitude, 
 
      latitude: res1Fixed.latitude 
 
     } 
 
     console.log(params); 
 
     return geodata.addGeoData(params); 
 
    }).then(function(result) { 
 
     console.log('addGeoData() done'); 
 
    }); 
 

 
mongoose.connection.close();

выполнение останавливается на корме er this line:

console.log ('fetchGeoData() done');

и я не могу понять, почему?

С уважением Джимми

+1

Вы пытались добавить обработчик ошибок ('.catch (console.error)') и посмотреть, что-то регистрируется? – Bergi

+0

Вы слишком рано вызываете 'connection.close()'; поместите его в обратный вызов 'then' – Bergi

+0

@Bergi узел будет регистрировать его автоматически. –

ответ

0

Если вы имеете в виду mongoose.connection.close(); что фактически запустить до вашего console.log('addGeoData() done');

Обратите внимание, что mongoose.connection.close() является синхронным, тогда как mongoose.findUser асинхронный.

+0

Спасибо всем вам за разъяснение это. Теперь он работает. –

+0

Привет @ J.Plexor, если этот или любой ответ разрешил ваш вопрос, пожалуйста, рассмотрите его, нажав галочку. Это указывает более широкому сообществу, что вы нашли решение и дали некоторую репутацию как самому, так и самому себе. Это не обязательно. – zurfyx

Смежные вопросы