我正在中等水平上关注本教程Using PostgreSQL and Sequelize to persist our data,现在我被困在db:migrate
上。它返回此错误
Sequelize CLI [Node: 12.1.0, CLI: 5.4.0, ORM: 5.8.2]
Loaded configuration file "config.json".
Using environment "development".
ERROR: Error parsing url: undefined
您可以看到我正在使用NodeJS版本12.1.0
和Sequelize CLI版本5.4.0
和Sequelize版本5.8.2
,它们都是最新版本。
在运行sequelize db:migrate
之前,我先运行此命令SET DATABASE_URL=postgresql://[user[:password]@][netlocation][:port][/dbname]
,它不会返回任何错误。
但是我运行db:migrate
我已经尝试找到问题了,但是还没有找到答案。
这是我的./Models/Index.js
文件。
'use strict';
require('dotenv').config();
import { readdirSync } from 'fs';
import { basename as _basename, join } from 'path';
import Sequelize from 'sequelize';
const basename = _basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../../config.json')[env];
const db = {};
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);
}
readdirSync(__dirname)
.filter(file => {
return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
})
.forEach(file => {
const model = sequelize['import'](join(__dirname, file));
db[model.name] = model;
});
Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
export default db;
如果您意识到我只是将其更改为ES6
格式而更改了一些代码,但是在我将其更改为ES6
之前,它也不起作用。以及本教程之后的所有其他文件。
以下是我认为具有关联的文件:
.env
DATABASE_URL=postgres://postgres:admin@localhost:5432/test_app
.sequelizerc
const path = require('path');
module.exports = {
"config": path.resolve('./config.json'),
"models-path": path.resolve('./app/Models'),
"migrations-path": path.resolve('./migrations')
};
config.json
{
"development": {
"use_env_variable": "DATABASE_URL"
},
"test": {
"use_env_variable": "DATABASE_URL"
},
"production": {
"use_env_variable": "DATABASE_URL"
}
}
如果我还没有包含某些文件,请告诉我,并请帮助我解决此问题的解决方案。谢谢
操作系统:Windows 10
答案 0 :(得分:3)
基本上,您无法成功设置环境变量DATABASE_URL
。
我不是Windows专家,但这应该可以完成您的工作。
如果您使用的是GitBash,那么它很简单:
export DATABASE_URL=postgres://postgres@localhost:5432/database_name
之后:
node_modules/.bin/sequelize db:migrate
编辑:
我不确定如何在gitbash和cmd中设置此变量。 这是另一种选择。
在config/config.json
"development": {
"username": "postgres"
"password": "postgres",
"database": "your_db_here",
"host": "127.0.0.1",
"dialect": "postgres"
},
根据您的postgres数据库更新这些变量。
并运行:
node_modules/.bin/sequelize db:migrate
答案 1 :(得分:2)
要使用环境变量,请避开config.json。而是在models / index.js中设置
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);
}
到
sequelize = new Sequelize(process.env.DATABASE_URL)
答案 2 :(得分:0)
AFAIK Sequelize迁移与正常的sequelize工作流程不同。
加载时正在读取config/config.json
-因此您不能使用系统环境变量-它必须是静态json文件。
在我的项目中,我要做的是config.js
文件,以确保配置文件使用我的任何设置都是最新的。
我在主程序启动时也在package.json
中执行以下操作:
(确保将npm-run-all
添加到您的package.json
中)
"scripts": {
"config": "node src/config.js",
"_migrate": "sequelize db:migrate",
"_migrate:status": "sequelize db:migrate:status",
"_migrate:undo": "sequelize db:migrate:undo",
"_seed": "sequelize db:seed:all",
"migrate": "npm-run-all config _migrate",
"migrate:status": "npm-run-all config _migrate:status",
"migrate:undo": "npm-run-all config _migrate:undo",
"seed": "npm-run-all config _seed"
},
config.js
只是在文件末尾执行了类似的操作:
// Export sequelize config/config.json for easy compatibality with sequelize-cli
const filepath = path.resolve(__dirname, '../../config');
const filename = path.join(filepath, 'config.json');
fs.ensureDir(filepath)
.then(() => fs.writeFileSync(filename, JSON.stringify(sequelizeConfig, 2) + '\n'))
.catch((err) => console.error(`Failed to write config: ${err}`));
sequelizeConfig
是完全生成的sequelize配置对象。您也可以像现在一样拥有通用的,并以此为基础。