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

标签 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
    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 + '.')

mysql.js

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 + '.')

关于javascript - Node.js 从回调函数中提取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20760824/

相关文章:

javascript - 如何在浏览器中以全屏模式播放图片或视频文件?

javascript - 盲人可以使用利用鼠标事件进行交互的网页吗

mysql - 从指定范围内的表中获取条目数

mysql - 如何通过传递周数在sql中获取月份数

javascript - 在 div 中显示通过 ajax 调用的脚本的进度

javascript - React-Router如何从客户端向服务器中间件发送请求?

mysql - Windows 上的 MySQL 中未启用 SSL

javascript - node.js & mysql - 如何获取最后插入的 ID?

javascript - Passport + NodeJs + Express 得到 "req.user"undefined

node.js - 获取父路由器的参数