Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用NodeJS从MySQL查询_Javascript_Mysql_Node.js_Express - Fatal编程技术网

Javascript 使用NodeJS从MySQL查询

Javascript 使用NodeJS从MySQL查询,javascript,mysql,node.js,express,Javascript,Mysql,Node.js,Express,我正在尝试查询MySQL数据库表。我使用NodeJS/Express作为后端 我已经像这样设置了MySQL。。(是的,我已经检查了后端是否连接到数据库。我刚刚遗漏了下面的凭据。) 我试图使我的代码有条理,所以我在一个配置文件中有这个。我想从其他文件导出db常量并执行db.query() 因此,我已经这样做了 module.exports = { app: app, db: db }; 但是,当我在其他文件中需要db时,请执行以下操作 const db = require('../../

我正在尝试查询MySQL数据库表。我使用NodeJS/Express作为后端

我已经像这样设置了MySQL。。(是的,我已经检查了后端是否连接到数据库。我刚刚遗漏了下面的凭据。)

我试图使我的代码有条理,所以我在一个配置文件中有这个。我想从其他文件导出db常量并执行db.query()

因此,我已经这样做了

module.exports = {
  app: app,
  db: db
};
但是,当我在其他文件中需要db时,请执行以下操作

const db = require('../../server');
它说db.query不是一个函数。有人知道为什么会这样说吗?我很可能无法正确地导出它

谢谢。

简短的回答 您可能有一个循环依赖项,即您有一个文件
a
,该文件
需要
s文件
b
,但文件
b
也需要
需要
s文件
a
。与使用
module.exports=something
(而不是修改现有的
exports
对象)相结合,这会导致一个模块将从
require
返回一个空对象,而不是另一个模块(其导出似乎不存在)

快速修复最有可能将
module.exports={app,db}
替换为
exports.app=app;exports.db=db
Object.assign(exports,{app,db})

至于为什么,以及在这不是最佳解决方案的情况下还有哪些其他选择,请阅读下文

长话短说 听起来好像你有一个循环依赖问题

让我解释一下,耐心点,我们最终会解决你的问题

请参阅,每个模块都以一个空对象开始,名为
module.exports
(也可作为
exports
)。如果您仅通过执行
exports.something=something
(或
module.exports.something=something
)来修改此对象,则在许多情况下,即使在顶层使用循环依赖项,只要导出对象的属性仅在以后访问,也可以正常工作。例如:

/*a.js*/
常数b=要求('./b')
exports.getX=函数(){
返回b.getY()*2
}
exports.getZ=函数(){
返回5
}
/*b.js*/
常数a=要求('./a')
exports.getY=函数(){
返回a.getZ()*3
}
/*main.js*/
常数a=要求('./a')
console.log(a.getX())//返回30
这里我们有一个循环依赖关系(
a
依赖于
b
,但是
b
也依赖于
a
)。然而,它是有效的

上述代码之所以有效,是因为当计算
a.js
时,它的
导出
对象将已经存在,并且当它需要
b.js
b.js
再次需要
a.js
时,即使
a.js
还没有完成顶级代码的运行,
b.js
中的
a
变量已经可以被分配到
a.js
exports
对象。此时它是一个空对象,但当行
返回a.getZ()*3
运行时,该对象将设置属性
getZ

  • main
    需要
    a
  • a
    需要
    b
  • b
    需要
    a
    并获取当前为空的对象
  • b
    定义其导出和返回的
    getY
  • a
    在其导出上定义
    getX
    getZ
    (与
    b
    已经获得引用的对象完全相同!)并返回
  • main
    调用
    a.getX()
  • a.getX
    调用
    b.getY
  • b.getY
    现在只访问
    a
    的属性
    getZ
    ,该属性现在确实存在(在步骤5中设置)
  • 请注意,如果我们编写了
    const{getZ}=require('./a')
    ,那么它就不会工作了,因为
    getZ
    属性在第3步就已经被访问了,而此时它还不存在

    但是,类似地,如果我们像这样编写
    a.js
    ,它也会停止工作:

    const b=require('./b')
    函数getX(){
    返回b.getY()*2
    }
    函数getZ(){
    返回5
    }
    module.exports={getX,getZ}
    
    这里最大的区别是我们现在正在重新分配exports对象!因此,
    b
    在步骤3中获得的对象是原始(空)对象,但我们随后将其重新分配给一个新对象(而不是修改现有对象),并且
    b
    中的代码永远没有机会获得对该对象的引用!然后,您会遇到这样一个确切的情况:
    require
    给您一个空对象,尝试调用
    A.getZ
    将失败
    A.getZ不是一个函数(因为它是
    未定义的

    (顺便说一句,
    module.exports=something
    exports=something
    不同,因为后者重新分配本地
    exports
    变量,并且不会更改其他模块将视为来自您的导出的内容!)

    我现在的假设是,您在这里有一个类似的问题-进行DB连接的文件需要使用DB连接的文件,但反过来也是如此

    您现在有两个选项:

    • module.exports={app,db}
      替换为
      exports.app=app;exports.db=db
      Object.assign(exports,{app,db})
      -这两种方法都会改变现有的exports对象,而不是替换它
    • 在以后的某个时间点需要其中一个文件,方法是在另一个函数中需要它,或者创建一个占位符变量
      let otherModule
      ,并导出一个
      init
      方法,使用
      otherModule=Require('./otherModule')
      实际填充它,然后调用此
      init
      方法
      const db = require('../../server');
      
      const mysql = require('mysql');
      
      connection = mysql.createPool({
          host: '***',
          user: '***',
          password: '***',
          database: '***'
      
      });
      
      module.exports = connection;
      
      const conn = require('path/to/dbfile.js');
      
      conn.query('SELECT * FROM TEST', function (err, rows) {
          if (err)
              return err;
          return rows;
      });