Javascript Node.js从回调函数中提取值
我有一个服务器文件,带有一个使用URL显示适当内容的开关。其中一个例子是/users,它应该显示某个表的JSON字符串。这是从mysql文件返回的 server.jsJavascript Node.js从回调函数中提取值,javascript,mysql,node.js,asynchronous,callback,Javascript,Mysql,Node.js,Asynchronous,Callback,我有一个服务器文件,带有一个使用URL显示适当内容的开关。其中一个例子是/users,它应该显示某个表的JSON字符串。这是从mysql文件返回的 server.js var http = require('http') var url = require('url') var port = 8080 function onRequest(request, response) { var pathname = url.parse(request.url).pathname co
var http = require('http')
var url = require('url')
var port = 8080
function onRequest(request, response) {
var pathname = url.parse(request.url).pathname
console.log('Request for ' + pathname + ' received.')
response.writeHead(200, {'Content-Type': 'text/html'})
response.write(run(pathname))
response.end()
}
function run(pathname) {
switch(pathname) {
case '/':
response = 'Welcome to my little test'
break
case '/time':
response = 'The time is ' + new Date().toLocaleTimeString()
break
case '/users':
var response
require('./mysql').getUsers(function(users) {
console.log(users)
response = users
})
return response
break
default:
response = 'Unable to locate the requested page'
}
return response
}
http.createServer(onRequest).listen(port)
console.log('Server started on port ' + port + '.')
var mysql = require('mysql')
var connection = mysql.createConnection({
user: "root",
password: "password",
database: "main"
})
exports.getUsers = function(callback) {
connection.query('SELECT * FROM users;', function (error, rows, fields) {
callback(JSON.stringify(rows));
});
};
mysql.js
var http = require('http')
var url = require('url')
var port = 8080
function onRequest(request, response) {
var pathname = url.parse(request.url).pathname
console.log('Request for ' + pathname + ' received.')
response.writeHead(200, {'Content-Type': 'text/html'})
response.write(run(pathname))
response.end()
}
function run(pathname) {
switch(pathname) {
case '/':
response = 'Welcome to my little test'
break
case '/time':
response = 'The time is ' + new Date().toLocaleTimeString()
break
case '/users':
var response
require('./mysql').getUsers(function(users) {
console.log(users)
response = users
})
return response
break
default:
response = 'Unable to locate the requested page'
}
return response
}
http.createServer(onRequest).listen(port)
console.log('Server started on port ' + port + '.')
var mysql = require('mysql')
var connection = mysql.createConnection({
user: "root",
password: "password",
database: "main"
})
exports.getUsers = function(callback) {
connection.query('SELECT * FROM users;', function (error, rows, fields) {
callback(JSON.stringify(rows));
});
};
server.js中的console.log(users)
可以很好地显示JSON字符串,但我不知道如何从回调中获取值并将其放入响应变量中
如果您有任何想法,我们将不胜感激。从回调中提取值的方法是将该值分配给回调范围之外的变量,但我不建议您这样做,因为这样会产生大量全局变量,而且您不知道何时将分配该变量。尝试此操作,看看会发生什么,以便了解回调和node.js的工作原理:
function run(pathname) {
switch(pathname) {
case '/':
response = 'Welcome to my little test'
break
case '/time':
response = 'The time is ' + new Date().toLocaleTimeString()
break
case '/users':
var response
var out_of_callback_users
require('./mysql').getUsers(function(users) {
out_of_callback_users = users
console.log("In the callback")
console.log(users)
response = users
})
console.log("After require");
console.log(out_of_callback_users) //Users have not been assigned yet
setTimeout(function(){
console.log("In the timeout")
console.log(out_of_callback_users)
},5000) //After 5 secs the query has been completed and users have been assigned.
return response
break
default:
response = 'Unable to locate the requested page'
}
return response
}
我要走的路是这样的:
function onRequest(request, response) {
var pathname = url.parse(request.url).pathname
console.log('Request for ' + pathname + ' received.')
response.writeHead(200, {'Content-Type': 'text/html'})
run(pathname, function(response){
response.write(response)
response.end()
})
}
function run(pathname,cb) {
switch(pathname) {
case '/':
cb('Welcome to my little test');
break;
case '/time':
cb('The time is ' + new Date().toLocaleTimeString());
break;
case '/users':
require('./mysql').getUsers(function(users) {
console.log(users);
cb(users);
})
break;
default:
cb('Unable to locate the requested page');
}
return;
}
http.createServer(onRequest).listen(port)
console.log('Server started on port ' + port + '.')
case '/users':
var response
require('./mysql').getUsers(function(users) {
console.log(users)
response = users
})
return response
break
您不需要序列化mysql返回的
行
即可使用它。您可以在getUsers
中处理它,也可以将它返回控制器。如果返回,请将代码更改为:
exports.getUsers = function(callback) {
connection.query('SELECT * FROM users;', function (error, rows, fields) {
callback(rows);
});
};
现在,在server.js
文件中,您可以处理返回的行,如:
case '/users':
var response = ''
require('./mysql').getUsers(function(users) {
for (var i in users) {
var user = users[i];
var userId = user.id;
var userName = user.user_name;
response += "User - ID: "+userId+" Name: "+userName+"\n";
}
})
return response;
break;
你可以处理你不能这样做。问题很简单。让我们来谈谈: 函数
getUsers
是一个异步函数。因此,代码如下所示:
function onRequest(request, response) {
var pathname = url.parse(request.url).pathname
console.log('Request for ' + pathname + ' received.')
response.writeHead(200, {'Content-Type': 'text/html'})
run(pathname, function(response){
response.write(response)
response.end()
})
}
function run(pathname,cb) {
switch(pathname) {
case '/':
cb('Welcome to my little test');
break;
case '/time':
cb('The time is ' + new Date().toLocaleTimeString());
break;
case '/users':
require('./mysql').getUsers(function(users) {
console.log(users);
cb(users);
})
break;
default:
cb('Unable to locate the requested page');
}
return;
}
http.createServer(onRequest).listen(port)
console.log('Server started on port ' + port + '.')
case '/users':
var response
require('./mysql').getUsers(function(users) {
console.log(users)
response = users
})
return response
break
首先,运行require('./mysql').getUser()
,然后直接执行返回响应
,然后执行中断
。当getUser
函数完成时,它将运行
function(users) {
console.log(users)
response = users
})
因此,您需要遵循一条规则:一旦使用异步,另一个函数必须是异步的。
我想知道你可以修改如下:
function onRequest(request, response) {
var pathname = url.parse(request.url).pathname
console.log('Request for ' + pathname + ' received.')
response.writeHead(200, {'Content-Type': 'text/html'})
run(pathname, function(res){ response.write(res)}) //changed
response.end()
}
function run(pathname, callback) {
switch(pathname) {
case '/':
callback('Welcome to my little test')
break
case '/time':
callback('The time is ' + new Date().toLocaleTimeString())
break
case '/users':
var response
require('./mysql').getUsers(function(users) {
console.log(users)
callback(users) # changed
})
break
default:
callback('Unable to locate the requested page')
}
}
http.createServer(onRequest).listen(port)
console.log('Server started on port ' + port + '.')
尝试在以下语句之后打印
响应
:response=users
。在我看来,它应该工作得很好。回调的值位于users
变量中,您正在将其分配给响应
变量。但是,我不确定如果return response
语句等待getUsers
函数完成,或者在它不等待之前触发,这就是问题所在。我发布了一个答案,希望能对您有所帮助,或者他可以在console.log(users)
@RaulRene之后调用return
语句,如果他在console.log(users)
之后调用return
,该语句将从传递给getUsers
函数的回调返回,不是从run
function这不会尝试修复原始问题。很抱歉误解,我只是想帮助您。我很高兴你现在有办法了。