TypeScript/Knex:不能在模块外使用 import 语句

时间:2021-01-25 11:11:13

标签: javascript node.js typescript knex.js

我是 TypeScript 的新手,目前正在使用 Knex 在我们的 PostgreSQL 数据库中构建模板表。在这个文件和其他文件上,我不断遇到与 TypeScript 相同的问题,代码如下:

import * as Knex from 'knex';


exports.up = async (knex: Knex): Promise<void> => {
    await knex.schema.raw(`
    CREATE TABLE test (
        test TEXT NOT NULL,
        tes2  INTEGER NOT NULL,
        PRIMARY KEY (key, website)
    ) 
`);
}


exports.down = async (knex: Knex): Promise<void> => {
    await knex.schema.dropTable('test');
}

我收到此错误:

import * as Knex from 'knex';
^^^^^^

SyntaxError: Cannot use import statement outside a module

我也尝试过这些变体:

   import * as Knex = require('knex');
   import { * as Knex } from 'knex';
   const * = require('knex');
   const { * as Knex } = require('knex');

但是我在网上找不到任何似乎可以解决问题的解决方案。

对此的任何帮助都会很棒。

2 个答案:

答案 0 :(得分:0)

您正在混合两种不同类型的模块。 import/exportJavaScript standard module syntax(“ECMAScript 模块”的“ESM”),但分配给 exports 上的属性是 CommonJS module syntax(又名“CJS”) .您需要使用其中一个,如果您使用 ESM,您需要通过在 "type": "module" 中使用 package.json 或使用 .mjs 文件扩展名来告诉 Node.js — 或,因为您使用的是 TypeScript,所以您可能需要 "module": "ES2020" 或类似的 (more here)。

该错误告诉我们 Node.js 和/或 TypeScript 认为您正在使用 CJS。如果您想继续这样做,可能是:

const Knex = require("knex");

...但是 see the documentation,因为它们显示将该导出作为函数调用。 (也许您稍后会这样做。)

答案 1 :(得分:0)

如果您设置 knex 而没有指定您将使用打字稿,则可能会发生此错误。

如果您要创建 typescript 迁移,请确保使用以下命令初始化 knex:

knex init -x ts