midwayjs / midway

🍔 A Node.js Serverless Framework for front-end/full-stack developers. Build the application for next decade. Works on AWS, Alibaba Cloud, Tencent Cloud and traditional VM/Container. Super easy integrate with React and Vue. 🌈
https://www.midwayjs.org/
MIT License
7.4k stars 577 forks source link

@midwayjs/faas-cli 迁移方案配合typeorm 使用问题? #620

Closed maqi1520 closed 4 years ago

maqi1520 commented 4 years ago

你好 使用 @midwayjs/faas-cli 进行部署 koa 迁移方案 使用代码 https://github.com/javieraviles/node-typescript-koa-rest

createConnection({ type: 'mysql', host: 'xxxx', port: 3306, username: 'root', password: 'xxxx', database: 'fass_test', synchronize: true, entities: [User, Video], }) .then(() => { console.log('TypeORM connection success'); }) .catch((err: string) => console.log('TypeORM connection error:', err));

const app = new Koa(); ... ...

module.exports = app;

但是本地调试开发是可以的, 部署成功后有段时间可以访问数据库,有的时候却报数据库服务连接错误,是什么原因呢? 使用sequelize 是可以的

czy88840616 commented 4 years ago

你是改了他的 new koa 部分方便导出,导致在服务起来时数据库还没连上?

maqi1520 commented 4 years ago

你是改了他的 new koa 部分方便导出,导致在服务起来时数据库还没连上?

没改 我现在把连接数据库部分移动到 index.js 部分

try {
  const layer_npm_koaLayer = require('@midwayjs/koa-layer');
  layers.push(layer_npm_koaLayer);
} catch(e) { }

let runtime;
let inited = false;

const initializeMethod = async (initializeContext = {}) => {
  runtime = await start({
    layers: layers,
    isAppMode: true
  });
  await typeorm_1.createConnection({
      type: 'mysql',
      host: 'xxx',
      port: 3306,
      username: 'root',
      password: 'xxx',
      database: 'fass_test',
      synchronize: true,
      entities: [user_1.User, video_1.Video],
  }) 
};

exports.initializer = asyncWrapper(async (...args) => {
  if (!inited) {
    inited = true;
    await initializeMethod();
  }
});

这样是可以的,但是这样我就得手动上传zip代码

czy88840616 commented 4 years ago

稍等,为方便这种情况,我加个异步方法,等 CI。

czy88840616 commented 4 years ago

发完了,文档已经更新 ,增加了异步的方法。

如果在初始化有异步的情况 ,比如连接数据库等,我们提供了异步的支持。

// app.js
const Koa = require('koa');
const Router = require('koa-router');
const app = new Koa();
// *****
// 注释原本的监听
// app.listen(3000);
// 导出默认的 app
module.exports = async ()  => {
  // do some async method, like db connect
    return app;
};