Node.js Typescript-导入模块-找不到模块

Node.js Typescript-导入模块-找不到模块,node.js,typescript,Node.js,Typescript,我在文件data.ts import mongoose from "mongoose"; const Schema = mongoose.Schema; const DataSchema = new Schema( { id: Number, message: String, }, { timestamps: true } ); module.exports = mongoose.model('Data', DataSchema);

我在文件
data.ts

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)

然后使用
导入{data as data}从“./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)

如果您使用的是typescript,请尝试如下导入:

import { Data} from "./Data";

let myData= new Data();

您需要像这样导出模型

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

export default Data;
并可以将其导入任何文件中,如

import Data from "./Data";

快速解决方案: 使用
ts节点
直接运行TypeScript文件

npm安装--dev ts节点
使用以下命令启动节点进程:

node-r ts node/register index.ts
确保您的
包.json
应该包含以下内容:

{
  "dependencies": {
    "mongoose": "^5.6.10",
    "typescript": "^3.5.3"
  },
  "devDependencies": {
    "ts-node": "^8.3.0"
  }
}
关于TypeScript:
  • TypeScript
    实际上是JavaScript的超集(不是子集)。

  • .ts
    文件必须先编译成JavaScript,然后才能在任何JavaScript环境(NodeJS、浏览器等)上运行

  • 通常在TypeScript项目中,
    package.json
    中有一个
    build
    命令,它将把
    .ts
    文件编译成
    .js
    文件,然后使用
    start
    命令以编译的
    js
    文件启动节点进程:

  • 或者,您可以使用直接运行
    .ts
    文件

  • 您在
    index.js
    javascript文件中导入了
    data.ts
    typescript文件?O_orRight-将两者都更新为.ts,但是当我尝试这两种方法时,仍然会得到相同的错误,就像我在问题中问您如何使用
    节点索引执行
    index.ts
    文件一样。ts
    Typescript是JavaScript的超集。节点不理解typescript文件。您需要首先将typescript文件转换为JavaScript,然后使用生成的
    index.js
    文件来运行您的程序。
    data
    是用户创建的文件。您不能使用
    'data'
    导入它,因为这将仅在全局或节点模块中查看。对于用户创建的模块,您需要提供文件的相对或绝对路径。e、 g.
    。/data'
    '/path/to/module/data'
    编辑了我的答案。请检查谢谢-更清楚。所以基本上我遇到了一些问题,因为我使用的是typescripts风格的导入和导出,但实际上并没有将其编译成JS?是的,NodeJS只与JS一起工作,而TS实际上比导入/导出更简单:,。。。
    {
      "scripts": {
        "build": "tsc index.ts",
        "start": "node index.js",
        "start:dev": "node -r ts-node/register index.ts"
      }
    }