运行扩展的 pg-promise 查询返回类型错误:无效的连接详细信息:未定义

问题描述 投票:0回答:1

我试图基于以下内容实现我的应用程序架构: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 的方式存在问题,而不是错误指示的连接问题。

pg-promise
1个回答
0
投票

我发现了问题所在。它位于 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 值不正确造成的。

© www.soinside.com 2019 - 2024. All rights reserved.