node.js - 如何解决 MEAN stack api 项目中 undefined reference 错误响应数据?

标签 node.js express

我正在尝试使用平均堆栈构建 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
};

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

最佳答案

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

数据库连接将阻塞 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
};

关于node.js - 如何解决 MEAN stack api 项目中 undefined reference 错误响应数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43279609/

相关文章:

html - 用于在圆 Angular 框中显示标签的 CSS 代码一旦上传到服务器就会中断

javascript - Ecmascript 6 带有 Promise 的递归函数

node.js - 仅当有新信息时才扫描 AWS DynamoDB 记录

mysql - ExpressJS - Sequelize - 列丢失错误

mysql - 从数据库获取响应作为数组而不是单独的对象

docker - 如何在 DevOps 部署中使用 TestCafe-Cucumber Node.js 项目

node.js - 如何使用 Express.js 为 Restful API 构建代码?

javascript - Access-Control-Allow-Origin 不起作用 Google Cloud Functions GCF

node.js - 如何获取从开始日期到当前日期的订阅者总数?

reactjs - 将 CRA 部署到 s3 并使用 Express 提供服务