我只是学会在我的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
(抱歉无法发布图片,新用户到stackoverflow)
我已经构建了一些简单的路由器' / user'并期望它应该调用用户控制器并从我的模型模块调用sequelize方法findAll(),但结果是它的错误说无法读取属性' list'未定义。以下是我的代码: 模型/ 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;
模型/ 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;
};
控制器/ 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));
}
};
控制器/ Index.ts
import users from './User'
export default {
users
}
路由器/ 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
Fyi,我的启动快速服务器,打字稿编译和webpack包的所有项目配置都已经很好了,而另一条路由是&#39; /&#39;和&#39; / about&#39;工作得很好。我知道有些东西我不知道,我仍然是续集的新手,感谢您的帮助。
答案 0 :(得分:0)
TL; DR:server/controllers/index.ts
不导出名为users
的绑定,迭代运送名为default
的绑定。
您正在使用controllers/Index.ts
功能导入require
模块。在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';