【发布时间】:2020-09-13 03:09:39
【问题描述】:
我正在阅读this Sequelize 和 Node.js 的教程。我在第 4 行收到以下错误:
TypeError:路径必须是字符串。收到未定义
const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(module.filename);
const env = process.env.NODE_ENV || 'development';
const config = require(`${__dirname}/../config/config.json`)[env];
const db = {};
let sequelize;
if (config.use_env_variable) {
sequelize = new Sequelize(process.env[config.use_env_variable]);
} else {
sequelize = new Sequelize(
config.database, config.username, config.password, config
);
}
fs
.readdirSync(__dirname)
.filter(file =>
(file.indexOf('.') !== 0) &&
(file !== basename) &&
(file.slice(-3) === '.js'))
.forEach(file => {
const model = sequelize.import(path.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;
module.exports = db;
似乎 module.filename 未定义。我不知道为什么会这样(我是 Node 新手),与教程和我的应用程序的唯一区别是我不使用 express api(但 GraphQL)并且我的 sequelize 自动生成的文件夹位于../ postgres/ 而不是 ../
编辑:
如果我运行教程存储库并打印 module.filename 我会得到 /Users/Creece/Downloads/postgres-express-node-tutorial-master/server/models/index.js
现在,如果我手动分配 module.filename,如下所示:module.filename = '/Users/Creece/Downloads/express_graphql_hmr_article_boilterplate-master/server/postgres/models/index.js';(在分配基本名称常量之前),我在 const model = ... 行上收到一个新的奇怪错误:
Error: Cannot find module '/Users/Creece/Downloads/express_graphql_hmr_article_boilerplate-master/server/dist/postgres/models/todo.js'
请注意,上述路径上的文件夹“dist”是 webpack 的(虽然不确定,但它不是我的)。
编辑2:(关于我对@NikMartin 回答的评论
这是 Sequelize 自动生成的文件 ./postgres/models/todo.js:
module.exports = (sequelize, DataTypes) => {
const Todo = sequelize.define('Todo', {
title: {
type: DataTypes.STRING,
allowNull: false,
},
});
Todo.associate = (models) => {
Todo.hasMany(models.TodoItem, {
foreignKey: 'todoId',
as: 'todoItems',
});
};
return Todo;
};
解决方案(基于接受的答案):
const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
//const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(`${__dirname}/../config/config.json`)[env];
const db = {};
let sequelize;
if (config.use_env_variable) {
sequelize = new Sequelize(process.env[config.use_env_variable]);
} else {
sequelize = new Sequelize(
config.database, config.username, config.password, config
);
}
const models = [
require('./Todo')(sequelize, Sequelize),
require('./TodoItem')(sequelize, Sequelize),
];
models.forEach(model => {
db[model.name] = model;
});
models.forEach(model => {
if (db[model.name].associate) {
console.log("entered");
db[model.name].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
【问题讨论】:
-
第 4 行
module.filename未定义。module中如何获取文件名 -
你的节点版本是多少?
node -v -
@FrançoisP。版本是 6.10.0
标签: javascript node.js postgresql postgresql-9.6