Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js从回调函数中提取值_Javascript_Mysql_Node.js_Asynchronous_Callback - Fatal编程技术网

Javascript Node.js从回调函数中提取值

Javascript 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

我有一个服务器文件,带有一个使用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
    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这不会尝试修复原始问题。很抱歉误解,我只是想帮助您。我很高兴你现在有办法了。