Javascript 使用NodeJS从MySQL查询
我正在尝试查询MySQL数据库表。我使用NodeJS/Express作为后端 我已经像这样设置了MySQL。。(是的,我已经检查了后端是否连接到数据库。我刚刚遗漏了下面的凭据。) 我试图使我的代码有条理,所以我在一个配置文件中有这个。我想从其他文件导出db常量并执行db.query() 因此,我已经这样做了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('../../
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;
});