无法从nodejs + node-mysql中获取模块的返回值

我的本地主机上有下面的代码:

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

有用。

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

你的get函数返回undefined因为你没有指定返回值。 你为你的callback函数指定了一个返回值,但是你的外部函数不知道或者关心这个。 如果你想要你期望的行为,你需要传递一个callback到你的get函数来访问rowsvariables。

尝试这个:

  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中asynchronous行为的一般概述,请查看此答案 。

原因是你的get函数正在调用一个asynchronous函数。 在调用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); }); }) 

你需要返回json如下

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