javascript - 将数据从模型传递到 Node js中的路由器

标签 javascript node.js express module

我正在尝试将一些数据从我的数据库传递到路由器,然后路由器将数据传递到 View 。

我的模型代码:

var mysql = require('mysql');

var connection = mysql.createConnection({
  host:       'localhost',
  user:       'root',
  password:   '',
  database:   'test'
});

var result; // empty var which should later be filled with the querys result

connection.connect();

var query = connection.query('SELECT * FROM users', function(err, res, fields) {
  if (err) throw err;

  result = res; // overwrite result with the querys result
  console.log(res); // This prints out everything I need
});


module.exports = {
  data: result // should contain the query result (= 2 objects in this case)
}

现在到我的路线文件:

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

var Users = require('../models/users');

console.log(Users.data);
/* GET home page. */
router.get('/users', function(req, res) {
    res.render('api', { data: Users.data, title: "Test API Output" });
});

module.exports = router;

当我使用 console.log Users 或 Users.data 时,我得到了 undefined。我真的不明白为什么会这样。我还应该如何沿着文件传递数据。

很高兴阅读所有帮助 :) 谢谢。

最佳答案

module.exports 会在您需要 的那一刻进行评估,在这种情况下,变量不会通过引用传递。

这对您的代码意味着以下内容:

    var result;  // result is "undefined" because it does not contain a value here
    // You are doing your DB queries here...
    module.exports = {
        data: result  // ...and because the query has not finished here yet, result 
                      // is still undefined. 
        // This is also a good example of a so called "race condition", because there is a 
        // slight (improbable) chance that the query might have already finished. 
        // Hence, it could happen that sometimes result is already filled.
    }

当你现在require你代码的另一个文件中的上述文件时,上面的文件正在被评估并立即保存(结果在那个时间点未定义,因此它在导出时也是未定义的)。 您的查询正在执行并写入 result 变量,但此时您不能再修改导出的变量——因为它是自己的变量,而不仅仅是对 result 的引用)。

您可以执行以下操作:

    function getData(callback) {
        connection.query('SELECT * FROM users', function(err, res, fields) {
            callback(err, res);
        });
    }

    module.exports = {
        getData: getData
    }

然后在你的其他文件中:

    var Users = require('../models/users');

    Users.getData(function(err, result) {
        // TODO: Error handling.
        console.log(result);
    });

这就是为什么 JavaScript 很容易陷入 回调 hell 的原因,因为它具有异步特性。

上面的情况与您,例如,想要通过 AJAX 从服务器获取一些数据,然后用它填充表格完全相同。当您开始创建表时,您拥有数据(因此 AJAX 请求尚未完成)时,您最终会得到一个空表。可以做的是:

  1. 您创建一个变量来保存您的数据,并且
  2. 创建表的函数

然后当您向服务器请求数据(通过 AJAX)时,您会等到获得数据(完成回调),然后才开始创建表:填充变量并调用函数以用数据填充表.

服务器端 JavaScript 与客户端相同。永远不要忘记这一点。

作为读者的小作业:摆脱回调 hell 的方法是通读promises——一种减少缩进并节省很多的模式/架构头痛:)

(更新:卢卡斯的回答基本上和我说的一样)
(更新 2:处理 err 的错误方式)

关于javascript - 将数据从模型传递到 Node js中的路由器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33000639/

相关文章:

javascript - hasOwnProperty ("foo") 总是返回 true,即使我将 foo 分配给 undefined - 为什么?

javascript - 将类事件设置为下一个幻灯片元素

javascript - 这个参数是如何传递给监听器的?

javascript - 将 session cookie传递给另一个ip?

node.js - Express.js 中如何跨模块访问 req 和 res?

mysql - 不能让你的两个或多个方法在同一条路线上

javascript - $q.when 不适用于匿名函数

node.js - 如何修复 "Response to preflight request doesn' t 通过访问控制检查 : It does not have HTTP ok status"error in react app with nodejs api

javascript - 获取位置的简单发布请求

javascript - Node.js 中的批处理请求