Sequelize - 无法阅读财产' list'未定义的

时间:2017-05-19 04:45:41

标签: 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

(抱歉无法发布图片,新用户到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;工作得很好。我知道有些东西我不知道,我仍然是续集的新手,感谢您的帮助。

1 个答案:

答案 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';