将数据从模型传递到节点js中的路由器
Passing data from model to router in node js
我正在尝试将一些数据从我的数据库传递到路由器,然后路由器将数据传递到视图。
我的型号代码:
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.data 我得到未定义。我真的不明白为什么会这样。我还应该如何沿着文件传递数据。
很高兴阅读所有帮助:) 谢谢。
我建议在route文件中实现consult,像这样:
var express = require('express');
var router = express.Router();
var Users = require('../models/users');
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();
/* GET home page. */
router.get('/users', function(req, res) {
var query = connection.query('SELECT * FROM users', function(err, res, fields) {
if (err) throw err;
result = res; // overwrite result with the querys result
res.render('api', { data: res.data, title: "Test API Output" });
});
});
module.exports = router;
但是您可以在 libs/mysql_connect.js
中的另一个文件中配置与数据库的连接。
undefined
是因为 connection.query
的 response
不符合 connection.query
.
module.exports
在你 require
的那一刻被评估,变量 不是 在这种情况下通过引用传递。
这对您的代码意味着以下内容:
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 很容易陷入 回调地狱 的原因,因为它是异步的。
以上情况与您 f.e. 完全相同,想通过 AJAX 从服务器获取一些数据,然后用它填充 tables。当你开始创建 table before 你有数据(所以 AJAX 请求还没有完成),你最终得到一个空的 table.可以做的是:
- 您创建了一个变量来保存您的数据并且
- 创建 table
的函数
然后当您向服务器请求数据(通过 AJAX)时,您等待直到获得数据(完成回调),然后才开始创建 table:填充您的变量和调用函数用数据填充 table。
服务器端JavaScript与客户端相同。永远不要忘记这一点。
作为 reader 的小作业:摆脱 回调 地狱的方法是阅读 promises – pattern/architecture 可以减少缩进并避免很多麻烦:)
(更新:卢卡斯的回答基本上和我说的一样)
(更新 2:错误的处理方式 err
)
如果您真的希望查询 运行 一次,然后重新使用已经查询过的数据,我认为您正在为您的模型寻找这样的东西:
...
var data;
var mymodel = {};
...
mymodel.getData = function(callback) {
if(data) {
callback(data);
} else {
db.query('select * from users', function(err,res,fields) {
// error checking and such
data = res;
callback(data);
});
}
}
module.exports = mymodel
在您的路由器中,您可以这样使用它:
...
router.get('/users', function(req, res) {
Users.getData(function(mydata) {
res.render('api', { data: mydata, title: "Test API Output" });
});
});
第一次调用 getData 时,您会得到一个新的结果,在后续调用中您会得到缓存的结果。
虽然您可以直接在 mymodel 中公开 data,并且仅在它仍未定义的情况下使用回调,但这会使您在路由器中的代码更加复杂。
我正在尝试将一些数据从我的数据库传递到路由器,然后路由器将数据传递到视图。
我的型号代码:
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.data 我得到未定义。我真的不明白为什么会这样。我还应该如何沿着文件传递数据。
很高兴阅读所有帮助:) 谢谢。
我建议在route文件中实现consult,像这样:
var express = require('express');
var router = express.Router();
var Users = require('../models/users');
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();
/* GET home page. */
router.get('/users', function(req, res) {
var query = connection.query('SELECT * FROM users', function(err, res, fields) {
if (err) throw err;
result = res; // overwrite result with the querys result
res.render('api', { data: res.data, title: "Test API Output" });
});
});
module.exports = router;
但是您可以在 libs/mysql_connect.js
中的另一个文件中配置与数据库的连接。
undefined
是因为 connection.query
的 response
不符合 connection.query
.
module.exports
在你 require
的那一刻被评估,变量 不是 在这种情况下通过引用传递。
这对您的代码意味着以下内容:
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 很容易陷入 回调地狱 的原因,因为它是异步的。
以上情况与您 f.e. 完全相同,想通过 AJAX 从服务器获取一些数据,然后用它填充 tables。当你开始创建 table before 你有数据(所以 AJAX 请求还没有完成),你最终得到一个空的 table.可以做的是:
- 您创建了一个变量来保存您的数据并且
- 创建 table 的函数
然后当您向服务器请求数据(通过 AJAX)时,您等待直到获得数据(完成回调),然后才开始创建 table:填充您的变量和调用函数用数据填充 table。
服务器端JavaScript与客户端相同。永远不要忘记这一点。
作为 reader 的小作业:摆脱 回调 地狱的方法是阅读 promises – pattern/architecture 可以减少缩进并避免很多麻烦:)
(更新:卢卡斯的回答基本上和我说的一样)
(更新 2:错误的处理方式 err
)
如果您真的希望查询 运行 一次,然后重新使用已经查询过的数据,我认为您正在为您的模型寻找这样的东西:
...
var data;
var mymodel = {};
...
mymodel.getData = function(callback) {
if(data) {
callback(data);
} else {
db.query('select * from users', function(err,res,fields) {
// error checking and such
data = res;
callback(data);
});
}
}
module.exports = mymodel
在您的路由器中,您可以这样使用它:
...
router.get('/users', function(req, res) {
Users.getData(function(mydata) {
res.render('api', { data: mydata, title: "Test API Output" });
});
});
第一次调用 getData 时,您会得到一个新的结果,在后续调用中您会得到缓存的结果。
虽然您可以直接在 mymodel 中公开 data,并且仅在它仍未定义的情况下使用回调,但这会使您在路由器中的代码更加复杂。