NodeJS 不能在模块外部使用import语句

0h4hbjxa  于 2023-04-20  发布在  Node.js
关注(0)|答案(7)|浏览(154)

我正在使用NextJS与typescript,mongo Atlas,mongoose,node和express。
运行node pages/server时出现以下错误:我已经上传了我的package.json文件并添加了babel
从“express”导入express;^^^^^^
语法错误:无法在wrapSafe(internal/modules/cjs/loader.js:1072:_compile(internal/modules/cjs/loader.js:1122:27)在Object.Module._extensions..js(internal/modules/cjs/loader.js:1178:10)在Module.load(internal/modules/cjs/loader. js:1002:32)在Function.Module._load(internal/modules/cjs/loader.js:901:14)at Function.executeUserEntryPoint [as runMain](internal/modules/run_main.js:七十四:12)在internal/main/run_main_module.js:十八:四十七
这是我的server.js代码:

import express from 'express';
import { connect, connection } from 'mongoose';
import morgan from 'morgan';
import path from 'path';
const app = express();
const PORT = process.env.PORT || 8080;
//Success
   import routes from './routes/api.tsx';

const MONGODB_URI = 'xxx';

// const routes=require('./routes/api')
connect(MONGODB_URI ||'mongodb://localhost/success', {
    useNewUrlParser: true,
    useUnifiedTopology: true
});

connection.on('connected', () => {
    console.log('Mongoose is connected');
});

const newBlogPost = new BlogPost(data); //instance of the model

app.use(morgan('tiny'));
app.use('/',routes)

app.listen(PORT, console.log(`Server is starting at ${PORT}`));

package.json文件

{
  "name": "la-sheild",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "dev": "next",
    "build": "next build",
    "start": "babel-node server.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@types/express": "^4.17.2",
    "@types/mongoose": "^5.7.1",
    "axios": "^0.19.2",
    "concurrently": "^5.1.0",
    "express": "^4.17.1",
    "mongoose": "^5.9.1",
    "morgan": "^1.9.1",
    "next": "^9.2.2",
    "node": "^13.8.0",
    "react": "^16.12.0",
    "react-dom": "^16.12.0"
  },
  "devDependencies": {
    "@babel/core": "^7.8.4",
    "@babel/preset-env": "^7.8.4",
    "@babel/register": "^7.8.3",
    "@types/node": "^13.7.4",
    "@types/react": "^16.9.21",
    "babel-cli": "^6.26.0",
    "typescript": "^3.7.5"
  },
  "proxy": "http://localhost:8080"
}
9cbw7uwe

9cbw7uwe1#

从Node v12开始,您可以使用.mjs扩展或在package.json中设置"type": "module"
您需要使用--experimental-modules标志运行node。

node --experimental-modules server.mjs

您可以查看SO link
或者你可以在你的项目的根目录下创建.babelrc文件。添加以下内容(以及你需要的任何其他babel预设,都可以添加在这个文件中):

{
    "presets": ["env"]
}

安装babel-preset-env使用

npm install babel-preset-env
npm install babel-cli -g

# OR

yarn add babel-preset-env
yarn global add babel-cli

现在,转到server.js文件所在的文件夹,然后
运行使用:

babel-node fileName.js

或者你可以使用npm start运行,将以下代码添加到package.json文件中:

"scripts": {
    "start": "babel-node server.js"
}

有一个教程link用于在介质上使用自定义Express Server + Typescript设置Next.js,这对您非常有帮助。

oymdgrw7

oymdgrw72#

下面的解决方案对我有效;

  • 安装所需的软件包

npm install nodemon @babel/core @babel/node @babel/preset-env -D

  • 在工作目录中创建一个**.babelrc**文件,并在其中粘贴以下内容
{
"presets": [
"@babel/preset-env" ]
}
  • 最后,将下面的代码添加到package.json中的"scripts"

"dev": "nodemon —exec babel-node server.js"其中server.js是本例中的文件。
希望这能起作用:)

uxh89sit

uxh89sit3#

下面是基于ts-next-express的解决方案。

npm i --save ts-node

为express创建另一个配置文件,因为node正在使用common.js模块,但如果检查tsconfig.json,您将看到以下内容:"module": "esnext"
tsconfig.server.json

{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "module": "commonjs",
    "outDir": "dist",
    "noEmit": false
  },
  "include": ["server"]
}

设置脚本如下:

"start": "ts-node --project tsconfig.server.json server.ts"
4nkexdtk

4nkexdtk4#

我得到相同的错误“语法错误:无法在模块“首先我添加类型:模块,但仍然面临另一个错误. Finaly它的工作对我来说,问题是这个我正在运行我的Driver.js文件,为什么我得到这个问题.我运行我的Driver.ts文件,它的工作对我来说没问题. enter image description here
但在运行我的扩展名为.ts的文件后,它的工作. enter image description here

w80xi6nr

w80xi6nr5#

我让index.ts从schema.js文件导入一个导出的var。
我在这个schema.js文件中做了一个导入
这是第二次导入导致“无法在模块外使用导入语句”。
最后将文件从schema.js重命名为schema.ts解决了这个问题。\

oyxsuwqo

oyxsuwqo6#

将import语句替换为:const MongoClient = require('mongodb ').MongoClient;

bxjv4tth

bxjv4tth7#

“scripts”:{“start”:“babel-node server.js”}
添加上面为我工作

相关问题