无法从nodejs + node-mysql

时间:2015-05-18 19:58:59

标签: javascript mysql node.js node-mysql

我在localhost上获得了以下代码:

/model/company.js

var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : 'admin'
});

module.exports = {
    get: function(){
        connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
            return rows;
        })
    }       
}

/routes/company.js

var Company    = require('../models/company')


var express = require('express');
var router = express.Router();

router.route('/companies').get(function(req, res){

    console.log(Company.get());
    //res.json(Company.get());


})

我已经尝试了一些东西,但我认为这应该是这样的。 但我的console.log会给我undefined。我不知道自己做错了什么。

如果我这样做:

 connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
                console.log(rows)
            })

有效。

我需要做什么(或学习)?

3 个答案:

答案 0 :(得分:2)

您的get函数返回undefined,因为您没有指定返回值。您为回调函数指定了返回值,但您的外部函数不知道或不关心它。如果您想要所期望的行为,则需要将回调传递给get函数,以便能够访问rows变量。

试试这个:

 module.exports = {
    get: function(callback){
        connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
            // A 'node-style' callback will usually be callback(error, value)
            callback(null, rows);
        })
    }       
}

如果您执行此操作,您的console.log将起作用:

Company.get(function(error, rows){
  console.log(rows);
}

有关javascript中异步行为的一般概述,请查看this answer

答案 1 :(得分:1)

原因是因为您的get函数正在其中调用异步函数。在你调用return rows的地方,它实际上是将行返回到匿名函数而不是get函数。

这基本上就是你所拥有的:

module.exports = {
    get: function(){
        connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
            //This return is returning THIS function --^
            return rows;
        });

        return; //You're not returning anything. So it's undefined like just calling return.
    }       
}

你想要什么:

/model/company.js:

...

module.exports = {
    get: function(callback){
        connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
            callback(rows);
        })
    }       
}

/routes/company.js:

...

router.route('/companies').get(function(req, res){
    Company.get(function (rows) {
        console.log(rows);
    });
})

答案 2 :(得分:-1)

您需要按如下方式返回json

get: function(){
        connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
            res.json(rows);
        })
    }