正在尝试导入并使用我的一个控制器中的数据库模块。初始连接已记录,但是,当从浏览器点击任何路由时,我收到以下错误:
“无法读取未定义的属性'query'”
database.js文件中的连接变量显然没有被设置,但就我的一生而言,我不知道为什么。
数据库.js
const mysql = require("promise-mysql");
const config = require("../config");
let connection;
mysql.createConnection(config.MYSQL)
.then(conn => {
connection = conn
console.log('Connected to ', config.MYSQL.database)
})
.catch(function (error) {
console.log(error)
})
module.exports = connection;
学校.js
const router = require('express').Router()
const Schools = require('../controllers/schools-controller')
const schools = new Schools
router.get('/', schools.getAllSchools)
...
module.exports = router
学校控制器.js
const db = require("../lib/database");
module.exports = class Schools {
async getAllSchools (req, res, next) {
const queryString = 'SELECT * FROM schools ORDER BY school_id ASC LIMIT 5'
try {
const results = await db.query(queryString);
if (results == "") {
res.status(404).json({ message: "No schools found" });
} else {
res.status(200).json(results);
}
} catch(error) {
next(error)
}
};
...
}
下面是我根据@sven的答案最终使用的pool函数
数据库.js
const pool = mysql.createPool(config.MYSQL);
pool.getConnection()
.then(function(connection) {
console.log(`Connected to database: ${config.MYSQL.database}`);
pool.releaseConnection(connection)
})
.catch(function(error) {
console.error(error.message);
});
module.exports = pool;
1条答案
按热度按时间svmlkihl1#
不能像那样导出异步获取的值。就像节点中的其他地方一样,您必须使用回调、承诺或异步函数。但是,因为这是针对mysql连接的,所以应该使用连接池。
在你的
database.js
-文件:您不需要在代码的其余部分进行任何代码更改。
或者,您可以使用
mysql2
而不是promise-mysql
(基于mysql
)因为它提供了许多受欢迎的特性,列在自述文件中。你的代码只需要很小的改动
npm i -S mysql2
或者yarn add mysql2
,然后更改行require("promise-mysql")
至require("mysql2/promise")
在你的database.js
-文件。可能正在更新config.js
以匹配可用于连接池的其他选项。否则mysql2
api与mysql
.