【问题标题】:Cannot get return from module in nodejs + node-mysql无法从 nodejs + node-mysql 中的模块获取返回
【发布时间】:2015-05-18 19:58:59
【问题描述】:

我在本地主机上得到以下代码:

/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)
            })

有效。

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

【问题讨论】:

    标签: javascript mysql node.js node-mysql


    【解决方案1】:

    您的 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

    【讨论】:

      【解决方案2】:

      原因是您的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);
          });
      })
      

      【讨论】:

        【解决方案3】:

        你需要返回json如下

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

        【讨论】:

        • 如果是这种情况,他还需要传入res 对象。一般来说,让您的数据库模块知道响应对象将如何工作可能不是一个好习惯。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-29
        • 2016-03-03
        • 1970-01-01
        • 2016-10-14
        • 2016-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多