【问题标题】:How to import mysql connection in another file in nodejs?如何在nodejs的另一个文件中导入mysql连接?
【发布时间】:2019-08-21 01:53:45
【问题描述】:

我无法将 mysql 连接文件从父文件导入另一个文件以建立数据库连接。

如果查询写在同一个文件中,我可以连接到数据库,如果我尝试在另一个文件中点击相同的查询,那么我会收到“TypeError:connection.query is not a function”错误。无法访问连接对象的任何功能。

这是我的 server.js 文件:

var express = require('express');
var cors = require('cors');
var mysql = require('mysql');
app = express(),
app.use(cors()),
port = process.env.PORT || 3001;
bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
config = {
    host: 'localhost',
    user: 'root',
    password: '',
    database: '<DB name>'
}
var connection = mysql.createConnection(config);

connection.connect(function(err){
    if (err){
        console.log('error connecting:' + err.stack);
    }
    console.log('connected successfully to DB.');
});


var routes = require('./api/routes/routes'); //importing route
routes(app);
console.log('todo list RESTful API server started on: ' + port);
app.listen(port);

module.exports= connection;

这是我的 api.js 文件:

'use strict';
var connection = require('../../server.js');

connection.query ('select * from <table name>', function(error, results){
    if (results){
        console.log(results);
    }
    else{
        console.log(error);
    }
});
or
exports.get=function(req,res){
        console.log(req.query.printerModel);
        console.log('inside get function');
        connection.query('select * from inkdetails', function(error, results){
            if (results){
                res.status(200).send(inkdetails)
                console.log(results);
            }
            else{
                res.status(400).send(error)
                console.log(error);
            }
        });
    };

【问题讨论】:

  • 你的代码输出''todo list RESTful API server started on: 3001' before 'connected to DB.'?
  • 你能在api.js文件中记录connection是什么吗?在您注册路由和处理程序之前,似乎尚未导出连接对象。

标签: mysql node.js express


【解决方案1】:

创建一个文件,该文件将处理连接并导出与mysql 相关的所需实用程序函数,然后您可以在启动文件中初始化连接并在任何处理程序中导入该连接对象。

你的mysql库:

const mysql = require('mysql');
const logger = require('your-looger-path');
const mysqlConfig = {
  host: 'localhost',
  user: 'root',
  password: '',
  database: '<DB name>'
}

var pool = mysql.createPool(mysqlConfig);

module.exports.connect = function (cb) {
  return new Promise((resolve, reject) => {
    pool.on('connection', function (connection) {
      connection.on('error', function (err) {
        logger.error('MySQL error event', err)
      });
      connection.on('close', function (err) {
        logger.warn('MySQL close event', err)
      });
    });
    resolve()
  })
}

async function executeQuery (query) {
  logger.debug(`query: `, query)
  return new Promise((resolve, reject) => {
    try{
      pool.query(query, (e, r, f) => {
        if(e){
          reject(e)
        }
        else{
          logger.debug(r,f)
          resolve(r[0])
        }
      });
    }
    catch(ex){
      reject(ex)
    }
  })  
}

async function execSP(spName, params){
  return new Promise((resolve, reject) => {
    try{
      var paramPlaceHolder = ''
      if(params && params.length){
        for(var i = 0; i < params.length; i++){
          paramPlaceHolder += '?,'
        }
      }
      if(paramPlaceHolder.length){
        paramPlaceHolder = paramPlaceHolder.slice(0, -1)
      }
      logger.debug('final SP call', `CALL ${spName}(${params})`)
      pool.query(`CALL ${spName}(${paramPlaceHolder})`, params, (e, r, f) => {
        if(e){
          reject(e)
        }
        else{
          resolve(r[0])
        }
      });
    }
    catch(ex){
      reject(ex)
    }
  })
}
module.exports.executeQuery = executeQuery
module.exports.execSP = execSP

然后在server.js文件中创建连接:

var express = require('express');
var cors = require('cors');
var mysqllib = require('require to your mysql wrapper created above');
app = express(),
app.use(cors()),
port = process.env.PORT || 3001;
bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());

mysqllib.connect().then(() => {
  console.log('Connected to mysql...')
  var routes = require('./api/routes/routes'); //importing route
  routes(app);
  console.log('todo list RESTful API server started on: ' + port);
  app.listen(port);

}).catch(e => {
  console.error('Error connecting mysql...')
  process.exit()
})

在你的控制器中

'use strict';
const mysqlLib = require('your mysql lib path')

exports.get = function(req, res){
  console.log(req.query.printerModel);
  console.log('inside get function');
  mysqlLib.executeQuery('select * from inkdetails').then((d) => {
    console.log(d);
    res.status(200).send(d)
  }).catch(e => {
    console.log(e);
    res.status(500).send('Sorry, something went wrong!')
  })
};

希望对您有所帮助。

【讨论】:

  • 非常感谢,会试一试,让你知道结果。
  • @vikranth 我也更新了导出其他函数的答案。
  • 非常感谢您的编辑,现在可以使用了。但是我有一个疑问:为什么连接功能的导出不起作用??
【解决方案2】:

创建一个配置文件夹并创建一个文件databaseConfig.js

var mysql = require('mysql');

config = {
   host: 'localhost',
   user: 'root',
   password: '',
   database: '<DB name>'
}
var connection =mysql.createConnection(config); //added the line
connection.connect(function(err){
  if (err){
    console.log('error connecting:' + err.stack);
  }
  console.log('connected successfully to DB.');
});

module.exports ={
     connection : mysql.createConnection(config) 
} 

app.js

var express = require('express');
var cors = require('cors');
app = express(),
app.use(cors()),
port = process.env.PORT || 3001;
bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
var routes = require('./api/routes/routes'); //importing route
routes(app);
console.log('todo list RESTful API server started on: ' + port);
app.listen(port);

controller.js

var config = require('../../databaseConfig.js');
var connection= config.connection
connection.query ('select * from <table name>', function(error, results){
   if (results){
     console.log(results);
   }
   else{
     console.log(error);
   }
});

【讨论】:

  • @narenda:我也尝试过你的方法,但在 database.js 文件中我收到“ReferenceError:未定义连接”
  • @vikranth 错过了 connection.connect 之前的一行,对不起,但现在我已经添加了这一行并编辑了代码,你可以看看,祝你有美好的一天
  • 欢迎您@vikranth,如果您觉得这对您有用,您可以将答案标记为正确,以便其他人觉得它很容易
猜你喜欢
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 1970-01-01
  • 2018-12-26
  • 2021-05-21
  • 2021-10-14
相关资源
最近更新 更多