我遇到了一个小问题。我正在尝试制作一个小型 API 来检查我的数据库中是否已存在用户。
我使用express和routes,所以我可以像“http://example.com/check/user/john”一样查询,它应该输出:true或false,具体取决于用户是否存在于数据库中。
在我的路线文件中,我有以下代码:
var mysql = require('mysql');
var pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: '123456',
database: 'nodejs'
});
module.exports = function(app){
app.get('/register/check/u/:username', function(req, res){
var output = 'false';
pool.getConnection(function(err, conn) {
query = conn.query('SELECT * FROM users WHERE username LIKE ?', [req.params.username]);
query.on('error', function(err){
throw err;
});
query.on('result', function(row){
var output = 'true';
console.log(row.email);
console.log(output);
});
conn.release();
});
res.render('register/check_username', { output: output});
});
);
问题是 res.render('register/check_username', { output: output});
将始终输出:false
,但在我的控制台中记录它当用户已存在时显示 true
。
知道为什么输出变量没有更新吗?
解决方案: 正如 akaphenom 所解释的,pool.getConnection 被初始化为非阻塞进程,因此我的第一个代码自动将输出发送为 false。这是工作代码:
app.get('/register/check/u/:username', function(req, res){
pool.getConnection(function(err, conn) {
var output = 'false';
query = conn.query('SELECT * FROM users WHERE username LIKE ?', [req.params.username]);
query.on('error', function(err){
throw err;
});
query.on('result', function(row){
output = 'true';
});
query.on('end', function(result){
res.render('register/check_username', { output: output});
});
conn.release();
});
});
最佳答案
我相信您不允许这些调用的非阻塞性质。该变量设置为 false,连接被调用,然后挂起回调。您在回调完成之前立即呈现响应。
module.exports = function(app){
app.get('/register/check/u/:username', function(req, res){
// you set the value of the output var
var output = 'false';
// this is a non-blocking call to getConnection which fires the callback you pass into it, once the connection happens. The code continues on - it doesn't wait.
pool.getConnection(function(err, conn) {
query = conn.query('SELECT * FROM users WHERE username LIKE ?', [req.params.username]);
query.on('error', function(err){
throw err;
});
query.on('result', function(row){
var output = 'true';
console.log(row.email);
console.log(output);
});
conn.release();
});
// you are getting here before the callback is called
res.render('register/check_username', { output: output});
});
);
为什么在控制台中得到正确的值?因为最终回调会被调用并执行您期望的操作。它只是在 res.render 之后调用
这更有可能是您想要的代码:
module.exports = function(app){
app.get('/register/check/u/:username', function(req, res){
pool.getConnection(function(err, conn) {
query = conn.query('SELECT * FROM users WHERE username LIKE ?', [req.params.username]);
query.on('error', function(err){
throw err;
});
query.on('result', function(row){
var output = 'true';
console.log(row.email);
console.log(output);
res.render('register/check_username', { output: output});
});
conn.release();
});
});
);
关于mysql - Nodejs Express/路线和 mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22994589/