Node.js Sequelize-无法读取属性';列表';未定义的
我刚刚学会在node.js项目中使用sequelize。总之,我的项目是ExpressJS+Typescript,Sequelize作为ORM,Webpack作为模块绑定器 下面是我的项目结构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
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));
}
};
就我个人而言,我会坚持你所拥有的,并写下你的作品