Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何解决平均堆栈api项目中未定义的参考错误响应数据?_Node.js_Express - Fatal编程技术网

Node.js 如何解决平均堆栈api项目中未定义的参考错误响应数据?

Node.js 如何解决平均堆栈api项目中未定义的参考错误响应数据?,node.js,express,Node.js,Express,我正在尝试使用mean stack构建API,但是当我使用postman使用get请求测试端点时,我得到以下错误: 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\ex

我正在尝试使用mean stack构建API,但是当我使用postman使用get请求测试端点时,我得到以下错误:

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)
但是,如果发送第二个get请求,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
};

如何在响应数据实际存在之前定义它?我很困惑,有人能解释一下我哪里出错了吗?

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

数据库连接将阻止I/O。这意味着您应该实现一个回调函数,在建立连接后执行,然后使用检索到的数据进行响应

我会将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
};

谢谢你,我已经试过了,我想我理解你的意思,尽管我遇到了另一个错误:F:\mean\api\controllers\students.controllers.js:17 dbconn.open(getStudentData);我似乎无法删除任何想法?谢谢你Peter我感谢你的帮助好消息是我通过删除结束时的大括号消除了错误,因为有太多的错误,但坏消息是它仍然不起作用,dbconn对象由于某种原因是空的?好的,我看到我更新了,修复了那个大括号。你现在遇到了什么错误?嗨@Peter Hauge,是的,dbconn对象由于某种原因是空的,它没有从dbconnection.js中得到任何东西。这可能与我使用的节点模块MSSQL有关吗?我使用的代码直接来自他们的自述文件。