为什么我的函数会丢失其 return 值?
Why does my function lose its return value?
下午好,我正在学习nodeJS。现在我设计的函数有问题,我似乎找不到问题所在
var http = require('http');
var mysql = require('mysql');
var url = require('url');
http.createServer(function (req, res) {
if (req.url === '/favicon.ico') {
//res.writeHead(200, {'Content-Type': 'image/x-icon'} );
res.end();
//console.log('favicon requested');
return;
}
var con = mysql.createConnection({
host: "localhost",
user: "admin",
password: "admin",
database: "brandibDB"
});
res.writeHead(200, {'Content-Type': 'text/plain'});
var addr = url.parse(req.url, true);
var teste = addr.pathname.split('/');
var tester = getJson(teste,con);
console.log(tester);
//console.log(teste);
//res.write(teste[1] + teste[2]);
res.end();
}).listen(8080);
function getJson(teste,con){
var resultado = "";
con.connect(function(err){
if (err) throw err;
if(teste[1] == 'users'){
if(teste.length!=2){
var str = "SELECT * FROM tblUsers where id ="+ mysql.escape(teste[2]) + "";
con.query(str, function (err, result, fields) {
if (err) throw err;
resultado = JSON.stringify(result);
});
}
else{
var str = "SELECT * FROM tblUsers";
con.query(str, function (err, result, fields) {
if (err) throw err;
resultado = JSON.stringify(result);
});
}
}
});
con.end;
return resultado;
}
console.log('Isto deve ser uma consola');
现在我在数据库中有数据,我正在测试使用 url 访问此服务器:"localhost:8080/users/1" 或 "localhost:8080/users/"
例如,当我 运行 第二个 link 时,它应该进入函数 getJson 和 return 正确的值(一个 json 与所有用户注册表)但它只是 return是空的。我试过将控制台日志放在 "resultado = Json..." 行周围的函数中,它显示了正确的值。结果后来就丢了。
有什么建议吗?
因为你的getJson函数在查询的异步回调完成之前就返回了,所以resultado还是一个空字符串。
相反,您可以提供对 getJson 的回调,在查询 returns 时调用该回调,或者更好的是,使用 promises。像这样:
var tester = getJson(teste, con)
.then(result => {
console.log('the results were:', results)
})
.catch(err => {
console.log('Something went wrong', err);
});
你的函数变成这样:
function getJson(teste, con) {
return new Promise((resolve, reject) => {
con.connect(function (err) {
if (err) throw err;
if (teste[1] == 'users') {
if (teste.length != 2) {
var str = "SELECT * FROM tblUsers where id =" + mysql.escape(teste[2]) + "";
con.query(str, function (err, result, fields) {
if (err) return reject(err);
return resolve(JSON.stringify(result));
});
} else {
var str = "SELECT * FROM tblUsers";
con.query(str, function (err, result, fields) {
if (err) return reject(err);
return resolve(JSON.stringify(result));
});
}
}
});
})
}
我还建议放弃 var 并使用 let 和 const,这样更容易跟踪变量范围。
下午好,我正在学习nodeJS。现在我设计的函数有问题,我似乎找不到问题所在
var http = require('http');
var mysql = require('mysql');
var url = require('url');
http.createServer(function (req, res) {
if (req.url === '/favicon.ico') {
//res.writeHead(200, {'Content-Type': 'image/x-icon'} );
res.end();
//console.log('favicon requested');
return;
}
var con = mysql.createConnection({
host: "localhost",
user: "admin",
password: "admin",
database: "brandibDB"
});
res.writeHead(200, {'Content-Type': 'text/plain'});
var addr = url.parse(req.url, true);
var teste = addr.pathname.split('/');
var tester = getJson(teste,con);
console.log(tester);
//console.log(teste);
//res.write(teste[1] + teste[2]);
res.end();
}).listen(8080);
function getJson(teste,con){
var resultado = "";
con.connect(function(err){
if (err) throw err;
if(teste[1] == 'users'){
if(teste.length!=2){
var str = "SELECT * FROM tblUsers where id ="+ mysql.escape(teste[2]) + "";
con.query(str, function (err, result, fields) {
if (err) throw err;
resultado = JSON.stringify(result);
});
}
else{
var str = "SELECT * FROM tblUsers";
con.query(str, function (err, result, fields) {
if (err) throw err;
resultado = JSON.stringify(result);
});
}
}
});
con.end;
return resultado;
}
console.log('Isto deve ser uma consola');
现在我在数据库中有数据,我正在测试使用 url 访问此服务器:"localhost:8080/users/1" 或 "localhost:8080/users/" 例如,当我 运行 第二个 link 时,它应该进入函数 getJson 和 return 正确的值(一个 json 与所有用户注册表)但它只是 return是空的。我试过将控制台日志放在 "resultado = Json..." 行周围的函数中,它显示了正确的值。结果后来就丢了。
有什么建议吗?
因为你的getJson函数在查询的异步回调完成之前就返回了,所以resultado还是一个空字符串。
相反,您可以提供对 getJson 的回调,在查询 returns 时调用该回调,或者更好的是,使用 promises。像这样:
var tester = getJson(teste, con)
.then(result => {
console.log('the results were:', results)
})
.catch(err => {
console.log('Something went wrong', err);
});
你的函数变成这样:
function getJson(teste, con) {
return new Promise((resolve, reject) => {
con.connect(function (err) {
if (err) throw err;
if (teste[1] == 'users') {
if (teste.length != 2) {
var str = "SELECT * FROM tblUsers where id =" + mysql.escape(teste[2]) + "";
con.query(str, function (err, result, fields) {
if (err) return reject(err);
return resolve(JSON.stringify(result));
});
} else {
var str = "SELECT * FROM tblUsers";
con.query(str, function (err, result, fields) {
if (err) return reject(err);
return resolve(JSON.stringify(result));
});
}
}
});
})
}
我还建议放弃 var 并使用 let 和 const,这样更容易跟踪变量范围。