Javascript nodejs模块抛出错误,但在主js文件中使用相同的代码
我想知道为什么这个自定义模块不工作 模块:Javascript nodejs模块抛出错误,但在主js文件中使用相同的代码,javascript,node.js,node-modules,Javascript,Node.js,Node Modules,我想知道为什么这个自定义模块不工作 模块: var mariadb = require('mariadb'); class DB{ constructor(){ this.db_conn = null; this.db_pool = mariadb.createPool({ host:"localhost", user:"root", pass
var mariadb = require('mariadb');
class DB{
constructor(){
this.db_conn = null;
this.db_pool = mariadb.createPool({
host:"localhost",
user:"root",
password:"",
database:"testdatabse"
});
this.db_pool.getConnection().then(conn => {
this.db_conn = conn;
});
}
};
module.exports = function(){
return (new DB()).db_conn;
}
但是在主javascript文件中使用相同的代码
主文件在此:
var http = require('http');
var url = require('url');
var mariadb = require('mariadb');
var dbs = require('./modules/mariadb-connector'); //here i am importing the module
var db_conn;
var db = mariadb.createPool({
host:"localhost",
user:"root",
password:"",
database:"testdatabase"
});
db.getConnection().then(conn => {
db_conn = conn;
});
console.log(dbs.query("SELECT * FROM array_languages")); //here it's throwing error
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'application/json'});
console.log(req.url);
db_conn.query("SELECT * FROM array_languages").then(data => {
res.write(JSON.stringify(data));
res.end();
});
}).listen(8080,"localhost");
错误:
PS D:\Programs\nodejs\test> node index.js
D:\Programs\nodejs\test\index.js:16
console.log(dbs.query("SELECT * FROM array_languages"));
^
TypeError: dbs.query is not a function
at Object.<anonymous> (D:\Programs\nodejs\test\index.js:16:17)
at Module._compile (internal/modules/cjs/loader.js:1063:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
at Module.load (internal/modules/cjs/loader.js:928:32)
at Function.Module._load (internal/modules/cjs/loader.js:769:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
at internal/main/run_main_module.js:17:47
PS D:\Programs\nodejs\test>node index.js
D:\Programs\nodejs\test\index.js:16
log(dbs.query(“从数组_语言中选择*));
^
TypeError:dbs.query不是函数
反对。(D:\Programs\nodejs\test\index.js:16:17)
at模块编译(内部/modules/cjs/loader.js:1063:30)
在Object.Module._extensions..js(internal/modules/cjs/loader.js:1092:10)
在Module.load(内部/modules/cjs/loader.js:928:32)
at Function.Module._load(内部/modules/cjs/loader.js:769:14)
在Function.executeUserEntryPoint[作为runMain](internal/modules/run_main.js:72:12)
在internal/main/run_main_module.js:17:47
这里是我尝试使用此模块时出现的错误
在console.log(dbs.query(“SELECT*FROM array_languages”)代码>
请解释为什么在主js文件中工作,但在模块中不工作。
有什么方法可以实现这一点吗?嗯,这不是同一个代码,是吗?你的问题是:
this.db_pool.getConnection().then(conn => {
this.db_conn = conn;
});
这是一个异步函数。它将在构造函数运行后完成运行。当DB\u conn
为null
时,您正在导入return(new DB()).DB\u conn
如果您打算将它作为一个类使用,我会创建一个方法getConnection
,在它完成运行后从db\u conn
获取值,然后导入实例而不是属性好吧,它不是同一个代码,是吗?你的问题是:
this.db_pool.getConnection().then(conn => {
this.db_conn = conn;
});
var dbs = require('./modules/mariadb-connector')
这是一个异步函数。它将在构造函数运行后完成运行。当DB\u conn
为null
时,您正在导入return(new DB()).DB\u conn
如果您打算将其作为类使用,我将创建一个方法getConnection
,在它完成运行后从db\u conn
获取值,并导入实例而不是属性
var dbs = require('./modules/mariadb-connector')
将dbs
设置为自定义模块的exports对象,这是将连接器返回到新数据库的函数:
function(){
return (new DB()).db_conn;
}
您可以在设置dbs
like时尝试调用导出模块
var dbs = require('./modules/mariadb-connector')();
但是,这留下了一个问题,即new db()
的.db\u conn
属性是在promise回调中异步设置的。在需要模块中的模块db conn
后,模块中的模块仍然是null
需要实现某种形式的异步处理,考虑到目前在获取数据库连接和为查询数据库的请求提供服务之间存在竞争条件。目前,设置连接赢得了竞争:这是连接代码位于主模块中时,它似乎起作用的唯一原因
创意的异步处理概述:
var http = require('http');
var url = require('url');
var mariadb = require('mariadb');
async function db_conn() {
let db_pool = mariadb.createPool({
host:"localhost",
user:"root",
password:"",
database:"testdatabse"
});
const conn = await db_pool.getConnection();
return conn;
}
db_conn().then( db_conn => {
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'application/json'});
console.log(req.url);
db_conn.query("SELECT * FROM array_languages").then(data => {
res.write(JSON.stringify(data));
res.end();
});
}).listen(8080,"localhost");
})
.catch( err=> {
console.error( err));
process.exit(1);
});
将dbs
设置为自定义模块的exports对象,这是将连接器返回到新数据库的函数:
function(){
return (new DB()).db_conn;
}
您可以在设置dbs
like时尝试调用导出模块
var dbs = require('./modules/mariadb-connector')();
但是,这留下了一个问题,即new db()
的.db\u conn
属性是在promise回调中异步设置的。在需要模块中的模块db conn
后,模块中的模块仍然是null
需要实现某种形式的异步处理,考虑到目前在获取数据库连接和为查询数据库的请求提供服务之间存在竞争条件。目前,设置连接赢得了竞争:这是连接代码位于主模块中时,它似乎起作用的唯一原因
创意的异步处理概述:
var http = require('http');
var url = require('url');
var mariadb = require('mariadb');
async function db_conn() {
let db_pool = mariadb.createPool({
host:"localhost",
user:"root",
password:"",
database:"testdatabse"
});
const conn = await db_pool.getConnection();
return conn;
}
db_conn().then( db_conn => {
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'application/json'});
console.log(req.url);
db_conn.query("SELECT * FROM array_languages").then(data => {
res.write(JSON.stringify(data));
res.end();
});
}).listen(8080,"localhost");
})
.catch( err=> {
console.error( err));
process.exit(1);
});
@DDiamond sorry not workedsaysTypeError:无法读取null的属性“query”
尝试module.exports=new DB()
,然后将require替换为var dbs=require('./modules/mariadb connector')。DB\u conn
@DDiamond抛出相同的错误我认为代码在console.log(dbs.query(“SELECT*FROM array_languages”))时没有初始化代码>execution@DDiamond抱歉未工作SaysTypeError:无法读取null的属性“query”
Trymodule.exports=new DB()
,然后将require替换为var dbs=require('./modules/mariadb connector')。DB\u conn
@DDiamond抛出相同的错误我认为代码在console.log(dbs.query(“SELECT*FROM array_languages”))时没有初始化代码>执行我正要编辑我的答案,错过了导出的未调用函数我正要编辑我的答案,错过了导出的未调用函数