nestjs报错: SyntaxError: Unexpected token import

最近使用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"

重新执行代码,顺利通过!!

发表评论

This site uses Akismet to reduce spam. Learn how your comment data is processed.