MEAN stack api项目中没有定义如何解决引用错误响应数据?

我试图用平均值堆栈来构build一个API,但是当我使用邮递员对请求进行testing时,出现以下错误:

ReferenceError: studentData is not defined at module.exports.StudentsGetAll (F:\MEAN\api\controllers\students.controllers.js:13:11) at Layer.handle [as handle_request] (F:\MEAN\node_modules\express\lib\router\layer.js:95:5) at next (F:\MEAN\node_modules\express\lib\router\route.js:137:13) at Route.dispatch (F:\MEAN\node_modules\express\lib\router\route.js:112:3) at Layer.handle [as handle_request] (F:\MEAN\node_modules\express\lib\router\layer.js:95:5) at F:\MEAN\node_modules\express\lib\router\index.js:281:22 at Function.process_params (F:\MEAN\node_modules\express\lib\router\index.js:335:12) at next (F:\MEAN\node_modules\express\lib\router\index.js:275:10) at Function.handle (F:\MEAN\node_modules\express\lib\router\index.js:174:3) at router (F:\MEAN\node_modules\express\lib\router\index.js:47:12) 

但是,如果发送第二个获取请求,则会根据需要返回studentData响应。 我究竟做错了什么?

Students.controllers.js

 var dbconn = require('../data/dbconnection.js'); module.exports.StudentsGetAll = function( req, res) { dbconn.open(); console.log('GET the Students'); res .status(200) .json(studentData); }; 

Dbconnection.js

 var sql = require('mssql'); var query = require('./queries.js'); var dburl = 'mssql://*****:****@**.**.*.**/******/*******'; function open() { var conn = new sql.Connection(dburl); var req = new sql.Request(conn); conn.connect(function (err) { if (err) { console.log(err); return; } console.log("Database Connection established"); req.query(query.getAllQuery, function (err, recordset) { if (err) { console.log(err); } else { studentData = recordset; } }); }); } module.exports = { open : open }; 

如何在实际存在之前定义响应数据? 我很困惑任何人都可以解释我要去哪里错了?

在第一次尝试中,您的代码将在数据库连接build立之前作出响应。 第二次会更好,因为数据库连接已经在第一次尝试后build立。

数据库连接将阻止I / O。 这意味着你应该实现一个callback函数,在连接完成后执行,然后用检索到的数据进行响应。

我将重写Students.controllers以下内容:

 // Students.controllers.js var dbconn = require('../data/dbconnection.js'); module.exports.StudentsGetAll = function( req, res) { var getStudentData = function(studentData){ res .status(200) .json(studentData); }; dbconn.open(getStudentData); console.log('Getting Students Records'); } //Dbconnection.js var sql = require('mssql'); var query = require('./queries.js'); var dburl = 'mssql://*****:****@**.**.*.**/******/*******'; function open(callback) { var conn = new sql.Connection(dburl); var req = new sql.Request(conn); conn.connect(function (err) { if (err) { console.log(err); callback({error: err}); // Respond back with error return; } console.log("Database Connection established"); req.query(query.getAllQuery, function (err, recordset) { if (err) { console.log(err); callback({error: err}); // Respond back with error } else { // Added Callback callback(recordset); // Respond back with data set } }); }); } module.exports = { open : open };