2015-01-06 32 views
0

我是Nodejs和JavaScript的新手。我已经开始了一个使用快递发电机的项目,并且已经安装了猫鼬皮卡。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;