Node.js Sequelize-无法读取属性';列表';未定义的

Node.js Sequelize-无法读取属性';列表';未定义的,node.js,express,typescript,webpack,sequelize.js,Node.js,Express,Typescript,Webpack,Sequelize.js,我刚刚学会在node.js项目中使用sequelize。总之,我的项目是ExpressJS+Typescript,Sequelize作为ORM,Webpack作为模块绑定器 下面是我的项目结构 src -router -server --config config.json --controllers index.ts User.ts --migrations --models index.js user.js --seeders App.ts index.ts

我刚刚学会在node.js项目中使用sequelize。总之,我的项目是ExpressJS+Typescript,Sequelize作为ORM,Webpack作为模块绑定器

下面是我的项目结构

src
-router
-server
--config
   config.json
--controllers
   index.ts
   User.ts
--migrations
--models
   index.js
   user.js
--seeders
 App.ts
 index.ts
(很抱歉,现在还不能发布图片,新用户已溢出)

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

models/user.js

控制器/User.ts

控制器/Index.ts

路由器/路由器.ts

从“express”导入*为express;
const userController=require('../server/controllers')。用户;
//初始化快速路由器
让router=express.router();
//设置API URL
路由器.get(“/”,(请求、恢复、下一步)=>{
res.json({
信息:“你好,世界!”
});
});
router.get('/about',(req,res,next)=>{
res.send(“这是关于

”); }); get('/user',userController.list()); 导出默认路由器

仅供参考,我对start express server、typescript编译和webpack捆绑包的所有项目配置都已正常运行,“/”和“/about”的其他路径也正常运行。我知道我遗漏了一些东西,我仍然是新的续集,谢谢你的帮助。

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

您正在使用
require
功能导入
controllers/Index.ts
模块。在CommonJS环境中,这将导入整个
模块。导出
对象。正如当前由TypeScript传输的一样,所需模块的每个命名导出都作为导入的属性公开

export default
子句表示名为
default
的导出。根据ES模块规范,有一个用于导入模块的
default
导出的缩写。那个速记是

import userController from '../server/controllers';
import userController from '../server/controllers';
另一方面,语法

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

导入具有与每次导出对应的属性的对象。在这种情况下,它的形状

{ default }
因此,如果使用
require
,则需要编写

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

所有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));
  }
};
就我个人而言,我会坚持你所拥有的,并写下你的作品


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

您正在使用
require
功能导入
controllers/Index.ts
模块。在CommonJS环境中,这将导入整个
模块。导出
对象。正如当前由TypeScript传输的一样,所需模块的每个命名导出都作为导入的属性公开

export default
子句表示名为
default
的导出。根据ES模块规范,有一个用于导入模块的
default
导出的缩写。那个速记是

import userController from '../server/controllers';
import userController from '../server/controllers';
另一方面,语法

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

导入具有与每次导出对应的属性的对象。在这种情况下,它的形状

{ default }
因此,如果使用
require
,则需要编写

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

所有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));
  }
};
就我个人而言,我会坚持你所拥有的,并写下你的作品