无法从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
函数来访问rows
variables。
尝试这个:
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); }) }