NodeJS 紧急停堆服务器第一条消息:客户端密码必须是字符串

5anewei6  于 2022-11-03  发布在  Node.js
关注(0)|答案(5)|浏览(170)

我已经阅读了几页关于这个问题的文档,但是我还没有能够修复这个特殊错误的问题。

throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: client password must be a string')
    ^

Error: SASL: SCRAM-SERVER-FIRST-MESSAGE: client password must be a string
    at Object.continueSession (C:\Users\CNFis\Desktop\WulfDevelopments\ThePantry\node_modules\pg\lib\sasl.js:24:11)
    at Client._handleAuthSASLContinue (C:\Users\CNFis\Desktop\WulfDevelopments\ThePantry\node_modules\pg\lib\client.js:257:10)
    at Connection.emit (events.js:400:28)
    at C:\Users\CNFis\Desktop\WulfDevelopments\ThePantry\node_modules\pg\lib\connection.js:114:12
    at Parser.parse (C:\Users\CNFis\Desktop\WulfDevelopments\ThePantry\node_modules\pg-protocol\dist\parser.js:40:17)
    at Socket.<anonymous> (C:\Users\CNFis\Desktop\WulfDevelopments\ThePantry\node_modules\pg-protocol\dist\index.js:11:42)
    at Socket.emit (events.js:400:28)
    at addChunk (internal/streams/readable.js:290:12)
    at readableAddChunk (internal/streams/readable.js:265:9)
    at Socket.Readable.push (internal/streams/readable.js:204:10)

这就好像在我的connectDB()函数中它不识别数据库的密码。我试图运行seeder.js脚本来为数据库播种有用的信息以用于测试目的,如果我运行npm run server脚本,它只是启动一个nodemon服务器,它将连接到数据库很好。但当我试图运行脚本来播种数据时,我返回了这个错误。

import { Sequelize } from "sequelize";
import colors from "colors";
import dotenv from "dotenv";

dotenv.config();

const user = "postgres";
const host = "localhost";
const database = "thePantry";
const port = "5432";

const connectDB = async () => {
  const sequelize = new Sequelize(database, user, process.env.DBPASS, {
    host,
    port,
    dialect: "postgres",
    logging: false,
  });
  try {
    await sequelize.authenticate();
    console.log("Connection has been established successfully.".bgGreen.black);
  } catch (error) {
    console.error("Unable to connect to the database:".bgRed.black, error);
  }
};

export default connectDB;

上面是我的connectDB()文件,同样,当我正常运行服务器时,它工作正常。但是我只有在尝试播种数据库时才收到这个错误。我将在下面发布我的播种脚本:

import dotenv from "dotenv";
import colors from "colors";
import users from "./data/users.js";

import User from "./models/userModel.js";

import connectDB from "./config/db.js";

dotenv.config();
console.log(process.env.DBPASS);

connectDB();

const importData = async () => {
  try {
    await User.drop();
    await User.sync();

    await User.bulkCreate(users);

    console.log("Data Imported".green.inverse);
    process.exit();
  } catch (e) {
    console.error(`${e}`.red.inverse);
    process.exit(1);
  }
};

const destroyData = async () => {
  try {
    await User.bulkDestroy();

    console.log("Data Destroyed".red.inverse);
    process.exit();
  } catch (e) {
    console.error(`${e}`.red.inverse);
    process.exit(1);
  }
};

if (process.argv[2] === "-d") {
  destroyData();
} else {
  importData();
}
oogrdqng

oogrdqng1#

在您的项目中添加您的.env文件,我认为您的.env文件在您的项目文件夹中丢失。添加如下:

rseugnpd

rseugnpd2#

所以,我可能已经通过在另一个项目中使用sequelize了解了这一点,事实证明,在我的server.js文件中到数据库的初始连接,老实说没有任何意义。不像Mongoose,连接在整个应用程序中可用。对于Sequelize来说,它不一样,它创建的连接只在某些地方明显,例如,我在其他项目中尝试了与此处相同的过程,但我尝试使用sequelize构建的model从DB中读取数据,并且收到了相同类型的错误,我进入了定义模型的位置,并在那里建立了sequelize连接,然后我就可以使用该对象模型从数据库中读取数据。
长话短说,为了修复这个应用程序中的错误,我必须在seeder.js文件中放置一个到数据库的连接,或者我必须在User模型中放置一个连接(这是理想的,因为我将在各个地方使用该模型),以便能够从数据库中播种信息或读取信息。

fumotvh3

fumotvh33#

今天我有同样问题,所以如果你使用关系型数据库,你必须从数据库定义密码。

const user = "postgres";
    const host = "localhost";
    const database = "thePantry";
    const password = "yourdatabasepassword"; if null > const password = ""; 
    const port = "5432";

但是,如果您使用非关系类型的数据库,只要属性相同,您就可以立即运行您定义的程序

fnvucqvd

fnvucqvd4#

我也面临着这个问题和另一个解决方案不同的接受解决方案在这里解决了我的问题,所以我想解释这一点,这个可爱的社区,太。
首先,当我面对这个问题时,我在调试模式下运行我的项目,并达到了下面的代码。

let sequelize;
if (config.use_env_variable) {
sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, config);
}

这里的问题实际上是显而易见的,当我第一次看到,有一个问题,在.env文件中提到的解决方案。在我的进程.env被定义为像下面一行:DATABASE_URL=postgres://username:password@IP_adress:port/db_name,而我的config.js文件的格式如下:

module.exports = {
  "development": {
    "url":"postgres://username:password@IP_adress:port/db_name",
    "dialect": "postgres",    
  }, ...
}

因此,作为一个解决方案,我来与以下修复参数是在Sequelize(...)。我下面的解决方案是完全为我工作,我希望它也为您工作。

let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.url, config);
}

最后一点,你需要小心你写的配置文件。这是最重要的在这种情况下。
再见了

5tmbdcev

5tmbdcev5#

这是我的情况。我有postgresql连接网址在我的环境像:

POSTGRES=postgres://postgres:test@localhost:5432/default

但我的配置如下:

POSTGRES_DB_HOST=localhost
POSTGRES_DB_PORT=5432
...rest of configs

现在已经解决了。

相关问题