我试图基于以下内容实现我的应用程序架构:https://github.com/vitaly-t/pg-promise-demo
// server.js
import express from "express";
import cors from "cors";
import db from "./db/connection/db.js";
import testConnection from "./db/connection/testConnection.js";
const app = express();
await testConnection(db);
app.use(express.json( {limit: '10mb'} ));
app.use(cors());
app.get("/", (_req, res) => {
// db.one(`
// CREATE TABLE IF NOT EXISTS questions (
// id SERIAL PRIMARY KEY,
// question TEXT NOT NULL,
// possible_answers TEXT[] NOT NULL,
// answer TEXT NOT NULL,
// category TEXT NOT NULL,
// difficulty INTEGER NOT NULL
// );
// `)
db.question.create()
.then(res => {
console.log(res);
})
.catch(err => {
console.error(err)
})
});
const PORT = process.env.PORT || 8000;
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
// questions.js
import queries from "../sql/sqlQueries.js";
class QuestionsRepository {
constructor(db, pgp) {
this.db = db;
this.pgp = pgp;
}
create() {
return this.db.none(queries.questions.create);
}
findAll() {
return this.db.any(queries.questions.findAll);
}
}
export default QuestionsRepository;
// sqlQueries.js
import QueryFile from "pg-promise";
// Helper for linking to external query files
function sql(file) {
const fullPath = new URL(file, import.meta.url); // generating full path;
const currQueryFile = new QueryFile(fullPath, {minify: true});
if (currQueryFile.error) {
console.error(currQueryFile.error);
}
return currQueryFile;
}
const queries = {
questions: {
create: sql('questions/create.sql'),
findAll: sql('questions/findAll.sql'),
}
}
export default queries;
// db.js
import pgPromise from 'pg-promise';
import dbConfig from './db-config.js';
import QuestionsRepository from "../repos/questions.js"
const initOptions = {
extend(obj) {
obj.question = new QuestionsRepository(obj, pgp);
}
}
const pgp = pgPromise(initOptions);
const db = pgp(dbConfig); // db - singleton instance of the database connection
export default db;
当我尝试运行在我的存储库中创建的 db.question.create() 函数时,遇到以下错误:
/opt/app/node_modules/pg-promise/lib/main.js:243 抛出新的 TypeError(
Invalid connection details:
+ npm.utils.toJson(cn));
类型错误:无效的连接详细信息:未定义
当我使用此函数测试与数据库的连接时,结果证明是成功的:
// testConnection.js
async function testConnection(db) {
try {
const conn = await db.connect(); // try to connect
conn.done(); // success, release connection
console.log(`Connection to database successful, PG server version: ${conn.client.serverVersion}`);
} catch (err) {
console.error(`Error connecting to database: ${err}`);
}
}
export default testConnection;
我还尝试直接运行相同的查询(server.js中的注释部分),成功创建了表。
由于这两个事实,我认为 QuestionsRepository 扩展 pg-promise 的方式存在问题,而不是错误指示的连接问题。
我发现了问题所在。它位于 sqlQueries.js 文件中。我把它改为:
import pgPromise from 'pg-promise';
const { QueryFile } = pgPromise;
// Helper for linking to external query files
function sql(file) {
const fullPath = new URL(file, import.meta.url).pathname; // generating full path;
const currQueryFile = new QueryFile(fullPath, {minify: true});
if (currQueryFile.error) {
console.error(currQueryFile.error);
}
return currQueryFile;
}
const queries = {
questions: {
create: sql('questions/create.sql'),
add: sql('questions/add.sql'),
delete: sql('questions/delete.sql'),
findAll: sql('questions/findAll.sql'),
drop: sql('questions/drop.sql'),
}
};
export default queries;
该错误是由于 QueryFile 导入不正确以及 fullPath const 值不正确造成的。