最近使用Nestjs来搭建梦支点的后台服务,头一回正式的尝试用NodeJs来做一次项目,很多后端的面向对象的概念,弄的有点窒息。看文档的几天,着实头大。
不过好在抗了过来,顺利进入项目开发阶段。
在执行npm run start:watch
完成项目的开发之后,打算就按现有完成的功能先把后台上线了让大家使用,然后出了问题。
整个开发过程中,没有尝试过去编译和基于上线环境执行,真到这一步的时候就不行了。
执行npm run prestart:prod
,基于tsc来编译项目,一切正常。
再执行命令npm run start:prod
,基于编译完的代码来启动服务,失败了。错误大致如下:
npm run start:prod
> nest-typescript-starter@1.2.0 prestart:prod /path/to/project
> tsc
> nest-typescript-starter@1.2.0 start:prod /path/to/project
> node dist/main.js
[Nest] 41866 - 2018-1-28 14:17:30 [ExceptionHandler] Unexpected token import
/path/to/project/src/entites/exchange-orders.entity.ts:1
(function (exports, require, module, __filename, __dirname) { import {Entity, Column, PrimaryGeneratedColumn} from 'typeorm';
^^^^^^
SyntaxError: Unexpected token import
at createScript (vm.js:80:10)
at Object.runInThisContext (vm.js:139:10)
at Module._compile (module.js:607:28)
at Object.Module._extensions..js (module.js:654:10)
at Module.load (module.js:556:32)
at tryModuleLoad (module.js:499:12)
at Function.Module._load (module.js:491:3)
at Module.require (module.js:587:17)
看错误,是nodejs识别不了import
这个标识符,可是编译之后的代码没有import了。而且我这边的代码执行,是都执行的编译之后dist
目录的,为啥会依赖了src
目录下的文件,还报错了?
仔细看了一下dist目录里面的文件,都是相对路径引用相关模块,不存在会引用到src。
在网上用搜索一番之后,把问题定位到了typeorm上。在这个项目里面,按照官方在sql上的最佳实践,使用typeorm来管理数据。为了方便管理mysql连接的相关配置,就在项目根目录新建了一个ormconfig.json
:
{
"type": "mysql",
"host": "localhost",
"port": 3306,
"username": "user",
"password": "pwd",
"database": "db",
"entities": ["src/**/**.entity{.ts,.js}"],
"synchronize": true
}
基于entities
指定的通配符,就能实现entity的自动加载。
看来问题也就出现在这个配置上了,肯定是在production环境下,typeorm还是加载了src目录下的entity,这样自然就出了问题。
所以解决方法就是如何能让这个配置根据环境自动去调整entities的值,找到了typeorm上关于这个配置文件的文档,
里面说到可以以js文件的方式输出配置。
这样一来就可以动态了。
修改后的ormconfig.js
如下:
const SOURCE_PATH = process.env.NODE_ENV === 'production' ? 'dist' : 'src';
module.exports = {
"type": "mysql",
"host": "localhost",
"port": 3306,
"username": "user",
"password": "pwd",
"database": "db",
"entities": [`${SOURCE_PATH}/**/**.entity{.ts,.js}`],
"synchronize": true
};
然后在package.json里面修改start:prod
命令:
"start:prod": " NODE_ENV=production node dist/main.js"
重新执行代码,顺利通过!!