我正在为我的项目使用NodeJS,Express和MySQL,并希望使用Bookshelf ORM。
Bookshelf使用Knex进行查询,建模,并建议通过Knex(http://bookshelfjs.org/#installation)设置数据库连接。
我无法与Knex建立成功的数据库连接。我想只在数据库连接成功时才启动服务器,但似乎在建立连接之后它没有提供任何东西(没有承诺或属性)。
这是我一直在使用的代码。
import _knex from "knex"; // npm install knex --save
import _bookshelf from "bookshelf"; // npm install bookshelf --save
let knex = _knex({
client: "mysql",
connection: {
host: "127.0.0.1",
database: process.env.DB,
user: process.env.DB_USERNAME,
password: process.env.DB_PASSWORD
},
debug: true
});
let bookshelf = _bookshelf(knex);
module.exports.knex = knex;
module.exports.bookshelf = bookshelf;
更多参考资料:还有另一个名为Sequelize的ORM,它提供了返回Promise的sequelize.authenticate()
,可以用作(http://docs.sequelizejs.com/en/latest/api/sequelize/#authenticate-promise)
sequelize.authenticate()
.then( () => {
console.log("Db successfully connected");
app.listen(port, () => console.log(`App started at: ${port}`) );
})
.catch( err => console.log('Unable to connect to the database') );
我能想到的唯一解决方案是执行像USE {DB_NAME}
这样的原始查询,并使用其输出来决定是否启动服务器。这个解决方案是否足够好?
答案 0 :(得分:7)
本周早些时候在knex
问题跟踪器中对此进行了讨论。 https://github.com/tgriesser/knex/issues/1886
进行查询是检查可以与数据库建立连接的好方法。如果没有进行查询,则池不需要创建任何初始连接(取决于池设置)。
您还可以连接池的afterCreate
回调,以便在与数据库(https://github.com/knex/documentation/pull/17/files)建立新连接时通知您。
答案 1 :(得分:0)
也许这可以给您的问题一些提示。
我最近正在调试与PostgreSQL数据库的错误的knex连接,发现(使用您的knex
变量)
knex.client.connectionSettings
包含具有连接,设置等的对象。 是否未建立连接未设置。我不知道确切的设置时间,所以我不知道它是否表示意图或成功。我只是一步。另外,这与您使用的ymmv不同。但是我会在客户端中查找您想要的信息,而不是在knex中查找。