TypeScript - 导入模块 - 找不到模块

9

我有一个位于 data.ts 文件中的模式(schema)。

import mongoose from "mongoose";
const Schema = mongoose.Schema;

const DataSchema = new Schema(
    {
        id: Number,
        message: String,
    },
    { timestamps: true }
);

module.exports = mongoose.model('Data', DataSchema);

当我尝试将其导入到我的index.js中时:

const Data = require('./data');

我一直看到这个错误:

internal/modules/cjs/loader.js:584
    throw err;
    ^

Error: Cannot find module './data'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:582:15)
    at Function.Module._load (internal/modules/cjs/loader.js:508:25)
    at Module.require (internal/modules/cjs/loader.js:637:17)

为什么会这样呢?我试图使用以下代码: export const data = mongoose.model('Data', DataSchema); 来导出模型,然后使用以下代码进行导入: import { data as Data } from './data' 但是却返回了以下错误。与此有关的任何想法吗?
import { data as Data } from './data'
       ^

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)

你是否在index.js的JavaScript文件中导入了data.ts的TypeScript文件?O_o - Plochie
已更新为.ts,但当我尝试两者时仍然会出现与我的问题相同的错误。 - userMod2
你是如何执行 index.ts 文件的? - Plochie
使用 node index.ts - userMod2
Typescript是JavaScript的超集。Node不能识别typescript文件,您需要首先将typescript文件转换为JavaScript,然后使用生成的“index.js”文件来运行程序。 - Plochie
3个回答

4

快速解决方案:

使用 ts-node 直接运行您的 TypeScript 文件。

npm install --dev ts-node

使用以下命令启动节点进程:

node -r ts-node/register index.ts

确保你的 package.json 文件中包含以下内容:

{
  "dependencies": {
    "mongoose": "^5.6.10",
    "typescript": "^3.5.3"
  },
  "devDependencies": {
    "ts-node": "^8.3.0"
  }
}

关于 TypeScript:

  1. TypeScript 实际上是 JavaScript 的超集(而非子集)。 typescript

  2. .ts 文件必须在任何 JavaScript 环境(如 NodeJS、浏览器等)中运行之前编译成 JavaScript。

  3. 在 TypeScript 项目中,通常会在 package.json 文件中有一个 build 命令,它将把你的 .ts 文件编译成 .js 文件,并跟随一个 start 命令以启动一个已编译的 js 文件的节点进程:

{
  "scripts": {
    "build": "tsc index.ts",
    "start": "node index.js",
    "start:dev": "node -r ts-node/register index.ts"
  }
}
  1. 或者您可以使用ts-node直接运行.ts文件。

谢谢 - 现在清楚多了。所以基本上我遇到问题是因为我使用了TypeScript的导入和导出方式,但实际上没有将其编译成JS? - userMod2
是的,NodeJS只能与JS一起使用,而TS实际上比import/export 模块系统还有更多功能:类型系统装饰器,... - Dat Le

0
如果您正在使用 TypeScript,请尝试像这样导入:

import { Data} from "./Data";

let myData= new Data();

3
data is user created file. You cannot import it using 'data' as this will look in global or node_modules only. For user created modules, you need to provide relative or absolute path of the file. e.g. './data' or '/path/to/module/data' - Plochie
修改了我的回答,请检查。 - user9966539

-3

你需要像这样导出你的模型,

const Data = mongoose.model('Data', DataSchema);

export default Data;

你可以在任何文件中导入它,例如:

import Data from "./Data";


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接