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 workedsays
TypeError:无法读取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抱歉未工作Says
TypeError:无法读取null的属性“query”
Try
module.exports=new DB()
,然后将require替换为
var dbs=require('./modules/mariadb connector')。DB\u conn
@DDiamond抛出相同的错误我认为代码在
console.log(dbs.query(“SELECT*FROM array_languages”))时没有初始化执行我正要编辑我的答案,错过了导出的未调用函数我正要编辑我的答案,错过了导出的未调用函数