如何在node-migrate中使用Typescript作为编译器

Chr*_*tos 5 database-migration node.js typescript

首先,这是我的迁移脚本:

const bluebird = require("bluebird");
const mongoose = require("mongoose");
mongoose.Promise = bluebird;
mongoose.connect("mongodb://localhost:27017/app", { useMongoClient: true    });

const schema = {    
    uid: {  
        type: String,   
    },  

    parentID: { 
        type: String,   
    },  

    name: { 
        type: String,   
    },  

    displayName: {  
        type: String,   
    },  

    createdAt: {    
        type: Date, 
    },  

    modifiedAt: {   
        type: Date, 
    }   
};  

const FolderSchema = new mongoose.Schema(schema);   
const FolderModel = mongoose.model("folders", FolderSchema);    


// initial folders  
const folders = [   
    { uid: "", parentID: "", name: "folder1", displayName: "Folder 1" },    
    { uid: "", parentID: "", name: "folder2", displayName: "Folder 2" },    
];  

function up(next) { 
    const promises = [];    
    folders.map((folder, index) => {    
        promises.push(FolderModel.create(folder));  
    }); 

    bluebird.all(promises).then((res) => {  
        mongoose.connection.close();    
        next(); 
    }); 
}   

function down(next) {   
    const promises = [];    
    folders.map((folder, index) => {    
        promises.push(FolderModel.remove({ name: folder.name }));   
    }); 

    bluebird.all(promises).then((res) => {  
        next(); 
    }); 
}   

module.exports.up = up;
module.exports.down = down;
Run Code Online (Sandbox Code Playgroud)

我使用node-migrate进行迁移,在高级迁移创建部分中,它说:

最后,如果您想使用较新的 ECMAscript 功能或 TypeScript 等语言插件进行迁移,则可以使用编译器标志。

但是当我使用--compiler="ts:typescript"运行脚本时,即使我已经安装了 typescript,它总是会抛出错误。

    C:\Users\john\Workspace\app\node_modules\migrate\lib\register-compiler.js:12
  require(mod)({
              ^

TypeError: require(...) is not a function
    at registerCompiler (C:\Users\john\Workspace\app\node_modules\migrate\lib\register-compiler.js:12:15)
    at Object.<anonymous> (C:\Users\john\Workspace\app\node_modules\migrate\bin\migrate-up:57:3)
    at Module._compile (module.js:635:30)
    at Object.Module._extensions..js (module.js:646:10)
    at Module.load (module.js:554:32)
    at tryModuleLoad (module.js:497:12)
    at Function.Module._load (module.js:489:3)
    at Function.Module.runMain (module.js:676:10)
    at startup (bootstrap_node.js:187:16)
    at bootstrap_node.js:608:3
Run Code Online (Sandbox Code Playgroud)

Teo*_*tev 10

您可以执行以下操作来ts-node使用node-migrate.

  1. 创建一个简单的js文件,其中包含:

    const tsNode = require('ts-node');
    
    module.exports = tsNode.register;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 执行迁移时将编译器标志与上述文件一起传递:

    migrate up --compiler="ts:./typescript-compiler.js"

这应该足以让您运行 TypeScript 迁移。


Sal*_*Sal 4

安装ts-nodetypescript

npm install --save-dev ts-node typescript

# or

yarn add --dev ts-node typescript
Run Code Online (Sandbox Code Playgroud)

然后,将编译器标志设置为以下内容:

--compiler="ts:ts-node/register"
Run Code Online (Sandbox Code Playgroud)

我认为 flag 中的值在您最初的尝试中ts:typescript分割成其组件(由字符分隔)时:表示如下:

  • ts: 文件扩展名
  • typescript:将注册新扩展和要加载的语言的模块

ts:typescript不起作用的原因是因为您node-migrate告诉require一个模块typescript用作将 TypeScript 编译器注册为模块加载器的模块。但是,requiretypescript模块不会为新颖的文件扩展名和语言注册新的导入逻辑。

为了能够使用requireTypeScript 文件(新颖的文件扩展名和语言),您需要注册适当的加载器。typescript是不是合适的加载程序。然而,ts-node/register绝对是。

  • 嗨@Salehen,我尝试了你的建议。所以我将命令更改为 `node_modules\.bin\migrate up --clean --state-file=".\src\migrations\.migrate" --migrations-dir=".\src\migrations" --compiler= "ts:ts-node/register"` 但它仍然给我同样的错误。我已经安装了 ts-node 和 typescript。`“ts-node”:“^ 5.0.0”,“打字稿”:“^ 2.4.0”` (2认同)
  • 不幸的是,从 2022 年 10 月开始,使用“ts-node”10.4.0 似乎不起作用。相反,/sf/answers/3729745981/ 似乎是可行的解决方案 (2认同)