2015-08-04 5 views
1

Я запрашиваю Twitter для местоположений, которые успешно возвращены. Эти местоположения затем хранятся в mongodb. Когда я запрашиваю базу данных через командную строку для местоположения: «Соединенное Королевство», данные о местоположении возвращаются. Однако, когда я запрашиваю базу данных на сервере NodeJS, ничего не возвращается (null).Запрос Mongoose на сервере NodeJS возвращает NULL

Вот код:

'use strict'; 

// Set default node environment to development 
process.env.NODE_ENV = process.env.NODE_ENV || 'development'; 

var express = require('express'); 
var mongoose = require('mongoose'); 
var config = require('./config/environment'); 

var Location = require('./api/twitter/location/twitter/location.model'); 

// Connect to database 
mongoose.connect(config.mongo.uri, config.mongo.options); 
mongoose.connection.on('error', function(err) { 
    console.error('MongoDB connection error: ' + err); 
    process.exit(-1); 
}); 

// Populate DB with sample data 
if(config.seedDB) { 
    Location.remove({}, function(err) { 
     console.log('Location collection removed'); 
    }); 
} 

// Setup server 
var app = express(); 
var server = require('http').createServer(app); 
var socketio = require('socket.io')(server, { 
    serveClient: config.env !== 'production', 
    path: '/socket.io-client' 
}); 

require('./config/socketio')(socketio); 
require('./config/express')(app); 
require('./routes')(app); 

// Start server 
server.listen(config.port, config.ip, function() { 
    console.log('Express server listening on %d, in %s mode', config.port, app.get('env')); 
}); 

// Expose app 
exports = module.exports = app; 

// Query Twitter for locations 
getLocations(); 

// Find location 'United Kingdom' 
var woeId = Location.findOne({'name': 'United Kingdom'}, 'woeId', function (err, location) { 
    console.log(location); 
    if (!err) { 
     return location; 
    } else { 
     console.log(err); 
    } 
}); 

// Gather available locations from Twitter 
function getLocations() { 
    twitterClient.get('trends/available', {}, function(errors, locations, response) { 
     if (!errors) { 
      storeLocations(locations); 
     } else { 
      console.log(errors); 
     } 
    }); 
} 

// Store locations in database 
function storeLocations(locations) { 

    for (var location in locations) { 

     Location.create({ 
      name: locations[location].name, 
      placeType: { 
       code: locations[location].placeType.code, 
       name: locations[location].placeType.name 
      }, 
      parentId: locations[location].parentid, 
      country: locations[location].country, 
      woeId: locations[location].woeid, 
      countryCode: locations[location].countryCode 
     }, function(err) { 
      if (err) { 
       console.log(err); 
      } 
     }); 
    } 
} 

Любая помощь с этим была бы оценена и спасибо заранее.

ответ

1

В node.js ваш вызов findOne является асинхронным.

// Find location 'United Kingdom' 
var woeId = Location.findOne({'name': 'United Kingdom'}, 'woeId', function (err, location) { 
    console.log(location); 
    if (!err) { 
     return location; 
    } else { 
     console.log(err); 
    } 
}); 

Похоже, вы ожидаете, что возвращаемое значение (местоположение), которые обеспечивают от обратного вызова, чтобы быть propogated к вар WOEID, но это никогда не произойдет.

Вместо этого вам необходимо выполнить любое действие, необходимое в рамках обратного вызова, которое может быть таким же простым, как установка глобальной переменной, но зависит от того, как вы планируете его использовать. Например:

// Find location 'United Kingdom' 
var woeId; 
Location.findOne({'name': 'United Kingdom'}, 'woeId', function (err, location) { 
     console.log(location); 
     if (!err) { 
       woeId = location; 
     } else { 
       console.log(err); 
     } 
}); 

Но помните, что значение будет недоступно до тех пор, пока не будет вызван асинхронный обратный вызов.

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