2017-01-10 18 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();

実行が後方を停止この行:

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

なぜ私は理解できませんか?よろしく ジミー

+1

エラーハンドラ( '.catch(console.error)')を追加して何かがログに記録されているかどうか確認しましたか? – Bergi

+0

あなたは 'connection.close()'をあまりに早く呼び出しています。 'then'コールバックに入れてください – Bergi

+0

@Bergiノードは自動的にそれを記録します。 –

答えて

0

あなたが実際にmongoose.connection.close()mongoose.findUserが非同期であるのに対し、同期していることを、あなたのconsole.log('addGeoData() done');

お知らせする前に実行されているmongoose.connection.close();を参照している場合。

+0

ご清聴ありがとうございますこの。それは今働いている。 –

+0

こんにちは@J.Plexorこれまたは任意の答えがあなたの質問を解決した場合は、チェックマークをクリックしてそれを受け入れることを検討してください。これは、あなたが解決策を見つけ出し、回答者とあなた自身の両方に評判を与えていることを広範なコミュニティに示します。これを行う義務はありません。 – zurfyx

関連する問題