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"
}
}