node.js - TypeORM + Webpack causa SyntaxError: token inesperado en el archivo de entidad
He configurado un proyecto bastante simple con express, node.js y webpack. Después de instalar TypeORM, al configurar webpack.config.js se produce un error de token inesperado para User.ts en la carpeta de entidad.
El problema parece estar relacionado con el hecho de que ormconfig.json está haciendo referencia a archivos de entidad .ts.
La solución en hilos similares parece ser usar ts-node con algunos parámetros adicionales, pero yo estoy usando webpack en este proyecto y ejecutando el archivo bundle.
index.ts
import 'reflect-metadata';
import { createConnection } from 'typeorm';
import { User } from './entity/User';
createConnection()
.then(async connection => {
console.log('Inserting a new user into the database...');
const user = new User();
user.firstName = 'Timber';
user.lastName = 'Saw';
user.age = 25;
await connection.manager.save(user);
console.log('Saved a new user with id: ' + user.id);
console.log('Loading users from the database...');
const users = await connection.manager.find(User);
console.log('Loaded users: ', users);
console.log(
'Here you can setup and run express/koa/any other framework.'
);
})
.catch(error => console.log(error));
ormconfig.json
{
"type": "mssql",
"host": "*",
"port": 27017,
"username": "*",
"password": "*",
"database": "*",
"synchronize": true,
"logging": false,
"entities": ["src/entity/**/*.ts"],
"migrations": ["src/migration/**/*.ts"],
"subscribers": ["src/subscriber/**/*.ts"],
"cli": {
"entitiesDir": "src/entity",
"migrationsDir": "src/migration",
"subscribersDir": "src/subscriber"
}
}
webpack.config.js
module.exports = {
mode: 'development',
entry: path.resolve(path.join(__dirname, './src/index.ts')),
externals: [nodeExternals()],
name: 'API',
context: __dirname,
target: 'node',
output: {
path: __dirname + '/dist',
filename: '[name].bundle.js',
publicPath: '/',
libraryTarget: 'commonjs2',
},
resolve: {
extensions: ['.ts', '.tsx', '.js', '.json'],
modules: [path.resolve(__dirname, 'node_modules')],
},
module: {
rules: [
{
test: /\.tsx?$/,
loader: 'awesome-typescript-loader',
exclude: [/node_modules/, /dist/],
},
{
test: /\.js$/,
loader: 'babel-loader',
exclude: [/node_modules/, /dist/],
options: {
babelrc: true,
},
},
],
},
plugins: [new CleanWebpackPlugin()],
};
Los mensajes de error son los siguientes (la referencia del código es el archivo de entidad de usuario predeterminado que viene con TypeORM)
api/src/entity/User.ts:1
(function (exports, require, module, __filename, __dirname) { import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
^
SyntaxError: Unexpected token {
at new Script (vm.js:80:7)
at createScript (vm.js:274:10)
at Object.runInThisContext (vm.js:326:10)
at Module._compile (internal/modules/cjs/loader.js:664:28)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)
at Module.load (internal/modules/cjs/loader.js:600:32)
at tryModuleLoad (internal/modules/cjs/loader.js:539:12)
at Function.Module._load (internal/modules/cjs/loader.js:531:3)
at Module.require (internal/modules/cjs/loader.js:637:17)
at require (internal/modules/cjs/helpers.js:22:18)
Respuesta #1
Encontré una solución de ayer por Soufiaane que no cubría el aspecto de webpack, pero que de todos modos resuelve el problema.
Elimina el archivo ormconfig.json y pasa la configuración de la base de datos en la función createConnection.
import { User } from './entity'
// import every other entity you have
// .......
await createConnection({
type: 'sqlite',
database: 'database.sqlite',
synchronize: true,
logging: true,
entities: [
User // pass your entities in here
]
})
Respuesta #2
Esto se debe a que estás llamando a la versión global de typeorm, que espera JavaScript; necesitas llamar a typeorm a través de ts-node así:
./node_modules/.bin/ts-node ./node_modules/.bin/typeorm
Configuré un alias en mi .bashrc:
alias tstypeorm='./node_modules/.bin/ts-node ./node_modules/.bin/typeorm'
Esta solución funciona bien para mí (ejecutándose en OsX)
(También podrías cambiar los directorios en tu ormconfig.json para apuntar a los archivos de JavaScript generados)
