gpt4 book ai didi

node.js - Sequelize - 无法读取未定义的属性 'list'

转载 作者:太空宇宙 更新时间:2023-11-04 02:06:34 25 4
gpt4 key购买 nike

我刚刚学习在我的 Node.js 项目中使用 Sequelize。总而言之,我的项目是 ExpressJS+Typescript,Sequelize 作为 ORM,Webpack 作为模块 bundler 。

下面是我的项目结构。

src
-router
-server
--config
config.json
--controllers
index.ts
User.ts
--migrations
--models
index.js
user.js
--seeders
App.ts
index.ts

(抱歉,还不能发布图片,stackoverflow 的新用户)

我已经构建了一些简单的路由器'/user'并期望它应该调用用户 Controller 并从我的模型模块调用sequelize方法findAll(),但结果是它的错误说无法读取未定义的属性'list'。下面是我的代码:models/index.js

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;

export default db;

models/user.js

export default function(sequelize, DataTypes) {
var user = sequelize.define('user', {
username: DataTypes.STRING,
name: DataTypes.STRING,
email: DataTypes.STRING,
password: DataTypes.STRING,
phone: DataTypes.STRING,
wallet: DataTypes.DECIMAL
}, {
classMethods: {
associate: function(models) {
// associations can be defined here
user.hasMany(models.top_up);
}
}
});
return user;
};

controllers/User.ts

let user = require('../models').user;

export default {
list(req, res) {
return user
.findAll()
.then(topUp => res.status(200).send(topUp))
.catch(error => res.status(400).send(error));
}
};

controllers/Index.ts

import users from './User'

export default {
users
}

router/router.ts

import * as express from 'express';

const userController = require('../server/controllers').users;

// Init express router
let router = express.Router();

// Setting API URL
router.get('/', (req, res, next) => {
res.json({
message: 'Hello World!'
});
});

router.get('/about',(req, res, next) => {
res.send('<p>This is about about</p>');
});

router.get('/user', userController.list());

export default router

仅供引用,我的所有启动 Express 服务器、TypeScript 编译和 Webpack bundle 的项目配置都已经很好,并且“/”和“/about”的其他路由也工作正常。我知道我遗漏了一些东西,我对 Sequelize 还是个新手,谢谢您的帮助。

最佳答案

TL;DR:server/controllers/index.ts 不会导出名为 users 的绑定(bind),而是导出名为 default 的绑定(bind)。

您正在使用 require 函数导入 controllers/Index.ts 模块。在 CommonJS 环境中,这会导入整个 module.exports 对象。正如当前由 TypeScript 转译的那样,所需模块的每个命名导出都会作为导入的属性公开。

export default 子句意味着名为 default 的导出。根据 ES 模块规范,有一个用于导入模块的 default 导出的简写。简写是

import userController from '../server/controllers';

另一方面,语法

import userController = require('../server/controllers');

const userController = require('../server/controllers'); // (or let or var)

导入一个对象,该对象具有与每个导出相对应的属性。在本例中,它的形状为

{ default }

所以如果你使用require,你需要这样写

import  userController = require('../server/controllers').default;

import userController from '../server/controllers';

所有 ES 模块样式导出均已命名,包括名为 default 的默认导出。

为了说明这一点,请考虑以下更详细但语义相同的形式

import {default as userController} from '../server/controllers';

如果您更愿意坚持使用 CommonJS 风格导出,在 NodeJS 中工作时避开 ES 模块,这是将单个对象导出为整个模块(由 require 返回的对象)的惯用方法

你可以写

// ../server/controllers/index.ts
export = {
list(req, res) {
return user
.findAll()
.then(topUp => res.status(200).send(topUp))
.catch(error => res.status(400).send(error));
}
};

就我个人而言,我会坚持你所拥有的并写作

import userController from '../server/controllers';

关于node.js - Sequelize - 无法读取未定义的属性 'list',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44061640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com