【问题标题】:UnhandledPromiseRejectionWarning: error: password authentication failed for userUnhandledPromiseRejectionWarning:错误:用户密码验证失败
【发布时间】:2019-11-18 15:06:29
【问题描述】:

我用这个命令在 创建了一个用户:

createuser --interactive

但它并没有要求输入新密码,所以我认为密码设置为我计算机的 sudo 密码。但是,当我尝试使用以下代码连接到我的数据库时:

async function connect() {
    let connection_string = "postgres://[username]:[password]@localhost:5432/[database]"
    let client = new pg.Client(connection_string)
    await client.connect()

    let query = await client.query("select * from Messages;")
    query.rows.forEach(row => {
        console.log(row)
    })
    await client.end()
}

我收到了这个错误:

(node:7106) UnhandledPromiseRejectionWarning: error: password authentication failed for user "[username]"

我该如何解决?

【问题讨论】:

  • 仅供参考,如果传递给new pg.Client()(即上述变量中​​的connection_string)的参数是错误的URL,那么无论如何你都会得到同样的错误。例如new pg.Client(undefined) 也会给出错误error: password authentication failed for user <username>。似乎提供更有用的错误消息是个好主意,因为这对我来说非常具有误导性。
  • 如果您使用的是node.js dotenvpg,请确保您的index.js 中有require('dotenv').config();。添加后,此错误已修复。

标签: postgresql javascript node.js postgresql


【解决方案1】:

修改 pg_hba.conf 上的访问方法以信任,为我做了。

$ sudo nano /etc/postgresql/13/main/pg_hba.conf 
# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust

重新加载服务,然后再次尝试连接。

const DB_URI = "postgresql:///<database_here>";
let db = new Client({ connectionString: DB_URI });
db.connect();

【讨论】:

  • 这个解决方案对我有用。 Zorin OS 16
【解决方案2】:

您需要使用 try catch 处理错误,还需要记录 unhandledRejection 的原因。这是根据您的情况的示例

async function connect() {
    try {
        let connection_string = "postgres://[username]:[password]@localhost:5432/[database]"
        let client = new pg.Client(connection_string)
        await client.connect()
    } catch (err) {
        throw err;
    }
    try {
        let query = await client.query("select * from Messages;");

        query.rows.forEach(row => {
            console.log(row)
        })

        await client.end()
    } catch (err) {
        throw err;
    }
}

process.on('unhandledRejection', (reason, promise) => {
    console.log('Unhandled Rejection at:', reason.stack || reason)
  });

【讨论】:

    【解决方案3】:

    请尝试使用以下简单代码连接 PostgreSQL 数据库。 使用用户名:教育和密码:password007 等凭据创建一个新用户。

     var express = require('express'),
        pg = require('pg'),
        app = express();
    
    //DB Connect String
    var connect = "postgres://education:password007@localhost/recipebookdb";
    
    
    app.get('/', function(req, res) {
        //Pg Connect
        // var pool = new pg.Pool()
        // console.log(req.params.user_id);
        pg.connect(connect, function(err, client, done) {
            if(err) {
                return console.error('error facing client from pool', err);
            }
            client.query('SELECT * FROM recipes', function (err, result) {
                if(err) {
                    return console.error('error runnign query', err);
                }
                res.render('index', {recipes: result.rows});
                done();
            });
        });
    });
    

    【讨论】:

      【解决方案4】:

      我不知道 Postgres DB,但我建议您在使用 NodeJS 时需要做的一件事。 NodeJS 提供了一个 unhandledRejection 钩子来处理全局的每一个 Promise 拒绝。您可以通过在主文件(server.js 或 app.js)中添加这样的代码来使用它。

      process.on('unhandledRejection', (reason, promise) => {
        // call a function which will send a mail of this rejection
      });
      

      您可以通过监控原因和承诺来更好地理解。 我希望它有所帮助。快乐编码:)

      【讨论】:

        【解决方案5】:
            async function connect() {
                let connection_string = "postgres://[username]:[password]@localhost:5432/[database]"
                let client = null;
                try {
                 new pg.Client(connection_string)
                 } catch (e) {
                  console.log (e);
        return;
                 }
        try {
                await client.connect()
        } catch (e) {
        return;
        }
        
        try {
                let query = await client.query("select * from Messages;")
        } catch(e) {
        return ;
        }
                query.rows.forEach(row => {
                    console.log(row)
                })
                await client.end()
            }
        

        您可以使用 try catch 块来处理错误。 现在为什么会出现错误,无论您提供的用户名/密码是什么错误,因为它无法与此详细信息连接

        【讨论】:

          【解决方案6】:

          我删除了用户,

          drop owned by [username];
          drop user [username];
          

          并重新创建了用户,这次使用以下命令:

          createuser -P -s -e [username]
          

          现在,它要求为该用户提供一个新密码。然后同样的代码就可以正常工作了。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-08-30
            • 1970-01-01
            • 1970-01-01
            • 2021-03-23
            • 2021-06-16
            • 2017-11-14
            • 1970-01-01
            • 2011-12-03
            相关资源
            最近更新 更多