2015-01-06 3 views
0

Я новичок в Nodejs и javascript. Я начал проект с использованием экспресс-генератора и установил с ним mongoose pacakge.Объявление переменной Nodejs

на маршрутах/index.js файл У меня есть этот код

var express = require('express'); 
var router = express.Router(); 
var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost/test'); 
var db = mongoose.connection; 
db.on('error', console.error.bind(console, 'connection error:')); 
db.once('open', function (callback) { 
    var toSchema = mongoose.Schema({ 
     name: String, 
     state : Boolean 
    }); 
    var listing = mongoose.model('todoSchema', toSchema) 
}); 

/* GET home page. */ 
router.get('/', function(req, res) { 
    var silence = new listing({ name: 'Silence', state:true }) 
    console.log(silence.name) // 'Silence' 
    res.render('index', { title: silence.name }); 
}); 
module.exports = router; 

Но когда я запустить сервер я получаю ошибку говоря

listing is not defined 

ReferenceError: listing is not defined 
at module.exports (D:\xampp\htdocs\nodeproject\myapp\routes\index.js:18:20) 
at Layer.handle [as handle_request] 
    D:\xampp\htdocs\nodeproject\myapp\node_modules\express\lib\router\layer.js:82:5) 
    at next (D:\xampp\htdocs\nodeproject\myapp\node_modules\express\lib\router\route.js:100:13) 
    at Route.dispatch (D:\xampp\htdocs\nodeproject\myapp\node_modules\express\lib\router\route.js:81:3) 
at Layer.handle [as handle_request] (D:\xampp\htdocs\nodeproject\myapp\node_modules\express\lib\router\layer.js:82:5) 
at D:\xampp\htdocs\nodeproject\myapp\node_modules\express\lib\router\index.js:235:24 
at Function.proto.process_params (D:\xampp\htdocs\nodeproject\myapp\node_modules\express\lib\router\index.js:313:12) 
at D:\xampp\htdocs\nodeproject\myapp\node_modules\express\lib\router\index.js:229:12 
at Function.match_layer (D:\xampp\htdocs\nodeproject\myapp\node_modules\express\lib\router\index.js:296:3) 
at next (D:\xampp\htdocs\nodeproject\myapp\node_modules\express\lib\router\index.js:190:10) 

Можете ли вы сказать мне, что я делаю неправильно и как работает объявление переменной?

+0

http://stackoverflow.com/questions/18259725/whats-the-proper-way-to-handle-mongoose-connections-with-express-js – BatScream

ответ

2

Это потому, что ваша листинговая переменная была определена из scope, которую вы хотите использовать. Попробуйте объявить переменную вне функции обратного вызова:

var listing; 
db.once('open', function (callback) { 
    var toSchema = mongoose.Schema({ 
     name: String, 
     state : Boolean 
    }); 
    listing = mongoose.model('todoSchema', toSchema); 
}); 

// you can use it anywhere as soon as it is initialized in time. 
0

Путаница исходит из того, что JavaScript не имеет блок сферы, но она имеет функцию сферы. Вы определяете listing в функции, поэтому эта переменная будет существовать только в этой функции. Попробуйте определение переменного за пределами области видимости функции:

var express = require('express'); 
var router = express.Router(); 
var mongoose = require('mongoose'); 
var listing; 

mongoose.connect('mongodb://localhost/test'); 

var db = mongoose.connection; 
db.on('error', console.error.bind(console, 'connection error:')); 
db.once('open', function (callback) { 
    var toSchema = mongoose.Schema({ 
     name: String, 
     state : Boolean 
    }); 
    listing = mongoose.model('todoSchema', toSchema) 
}); 

/* GET home page. */ 
router.get('/', function(req, res) { 
    var silence = new listing({ name: 'Silence', state:true }) 
    console.log(silence.name) // 'Silence' 
    res.render('index', { title: silence.name }); 
}); 
module.exports = router; 
Смежные вопросы