我希望将结果保存在其他文件上,但没有获取返回的方法
function getUsers(){
console.log("Fetching all user data");
const connection = getConnection();
const sql = "SELECT * FROM users";
var result = connection.query(sql,(err, rows, fields) =>{
if(err){
console.log("Failed to get users data");
res.sendStatus(500);
throw err;
}
console.log("Fetched Users Successfully");
return rows;
})
return result;
}
答案 0 :(得分:0)
由于代码是异步的,因此无法获得结果。因此,您必须使用async / await来获得结果。您的代码应如下所示:-
async function getUsers(){
console.log("Fetching all user data");
const connection = await getConnection();
const sql = "SELECT * FROM users";
try {
var result = await connection.query(sql);
console.log("Fetched Users Successfully");
return result;
} catch (err) {
console.log("Failed to get users data");
res.sendStatus(500);
throw err;
}
}
最后,像这样调用此函数:-
var output = await getUsers();
但是请确保您在异步函数中调用此行。 希望这会有所帮助!
答案 1 :(得分:0)
为功能创建文件:getUsers.js
module.exports = async getUsers(){
const connection = getConnection();
const sql = "SELECT * FROM users";
var myPromise = () => {
return new Promise((resolve, reject) => {
connection.query(sql, query.params, function (error, results, fields) {
error ? reject(error) : resolve(results);
})
});
}
var result = await (myPromise());
return result;
}
需要此文件并调用函数:
var getUsers = require('..path to getUsers');
var data = getUsers().then((data)=>{
}).catch((error)=>{
console.log('error',error)
return error;
});
使用回调:
或使用回调函数:
module.exports = function getUsers(callback){
const connection = getConnection();
const sql = "SELECT * FROM users";
connection.query(sql, query.params, function (error, results, fields) {
if(error){ callback(error,null)}
if(!error && results){
callback(null,results)
}
});
}
需要文件:
var getUsers = require('..path to getUsers');
这样称呼:
getUsers(err,data)=>{
if(err){
return res.send(err);
}
if(!err && data){
return res.send(data);
}
}
答案 2 :(得分:0)
function getUsers(callback) {
console.log("Fetching all user data");
const connection = getConnection();
const sql = "SELECT * FROM users";
connection.query(sql, (err, rows, fields) => {
if (err) {
console.log("Failed to get users data");
res.sendStatus(500);
callback(err, null);
}
console.log("Fetched Users Successfully");
callback(null, rows)
})
}
// USE ABOVE FUNCTION AS BELOW...
getUsers(function(err, rows) {
if(err){
console.error(err);
}
console.log(rows);
})
答案 3 :(得分:0)
这是一个标准的异步函数问题。
return rows
不会为result
变量分配行。 query()
函数的第二个参数是一个回调函数,它指示将在获取行之后执行的代码块。这意味着查询结果仅在回调块内可见。
您可以通过2种方式修复它:
getUsers()
。如果选择这种方法,最好的方法可能是将回调传递给getUsers()
函数,然后在query()
方法的回调中调用它。 示例:
getUsers(callback){
const connection = getConnection();
const sql = "SELECT * FROM users";
connection.query(sql,(err, rows, fields) => callback(rows))
}
mainFunction(req,res){
getUsers(doSomethingWithUsers)
}
doSomethingWithUsers(users){
...
}
这当然是过分简化的模式,但是思路应该很清楚。
研究promise及其如何处理异步功能。这将需要您将函数主体“包装”为Promise
对象类型。
他们将允许您编写如下内容:
mainFunction(){
getUsers()。then(result => ....);
//甚至
const users =等待getUsers();
}
编辑:
要包装“ promise的返回值”或如我们所说的“解决promise”,可以按以下方式包装函数:
function getUsers(){
console.log("Fetching all user data");
const connection = getConnection();
const sql = "SELECT * FROM users";
return new Promise( (resolve,reject) => {
var result = connection.query(sql,(err, rows, fields) =>{
if(err){
// this will cause promise to "fail"
reject(err);
}
console.log("Fetched Users Successfully");
// this will tell javascript that promise is finished
// and rows are accesable in then()
resolve(rows);
})
})
}
function mainFunction(){
const result = getUsers()
.then(rows =>{/** this will happen if resolve(rows) is called */})
.catch(error => {/** this will be executed if reject(err) happens
*/});
}
// or... (Try/Catch is required since "await" silently fails
async function asyncMainFunction(){
try{
const rows = await getUsers();
// You can use rows from resolve() here;
}catch(error){
// here, reject is called
}
}
这里是一个链接,您可以在其中阅读有关诺言的更多信息: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise