无法在模块外部使用导入语句。

23

我正在使用NextJS、typescript、mongo Atlas、mongoose、node和express。

当我运行node pages/server时,我遇到了以下错误:我已经上传了我的package.json文件并添加了babel

import express from 'express'; ^^^^^^

SyntaxError: Cannot use import statement outside a module at wrapSafe (internal/modules/cjs/loader.js:1072:16) at Module._compile (internal/modules/cjs/loader.js:1122:27) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1178:10) at Module.load (internal/modules/cjs/loader.js:1002:32) at Function.Module._load (internal/modules/cjs/loader.js:901:14) at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12) at internal/main/run_main_module.js:18:47

这是我的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"
}

是的,它包括以下依赖关系: "dependencies": { "@types/express": "^4.17.2", "@types/mongoose": "^5.7.1", "axios": "^0.19.2", "concurrently": "^5.1.0", "express": "^4.17.1", - EverydayDeveloper
你启用了ES6导入吗? - Deep Kakkar
请问您能分享一下您的 package.json 文件吗? - Deep Kakkar
v12.16.1 @DeepKakkar - EverydayDeveloper
还可以尝试在lib对象中添加“es2015”,看看会发生什么。 - Juhil Somaiya
显示剩余12条评论
7个回答

16
自 Node v12 版本开始,您可以使用 .mjs 扩展名或在您的 package.json 中设置 "type": "module" 来进行模块化开发。同时需要使用 ---experimental-modules 标志来运行 Node。
node --experimental-modules server.mjs
您可以查看此链接
或者您可以在项目的根目录下创建.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

或者您可以通过将以下代码添加到您的package.json文件并使用npm start来运行:

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

这是一篇介绍如何在 Next.js 中使用自定义 Express 服务器和 TypeScript 的教程,可以在 Medium 上的链接中找到,非常有帮助。


我没有webpack.config.js文件。 - EverydayDeveloper
@Rebel 这里有一个教程适合你 https://levelup.gitconnected.com/set-up-next-js-with-a-custom-express-server-typescript-9096d819da1c - Deep Kakkar
2
感谢您关于Babel的说明。其他所有内容都在讲如何将"type": "module"添加到您的package.json中,但这并不是解决方案。 - backus
1
这对我很有效。我无法感谢你们足够了。 - Arif Shaikh

12
以下解决方案对我有效:
安装所需的软件包
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 是你的文件名。

  • 希望这能够起作用 :)


    1
    我一开始遇到了相同的错误:“SyntaxError: Cannot use import statement outside a module”,我添加了"type: module"但仍然面临另一个错误。最终,我解决了这个问题,原因是我在运行Driver.js文件,这就是为什么我遇到这个问题的原因。我运行了我的Driver.ts文件,它对我来说可以正常工作。 输入图像说明 但是,当我使用扩展名为.ts的文件运行时,它可以正常工作。 输入图像说明

    1
    这是基于 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"
    

    0

    我在我的index.ts文件中导入了一个从schema.js文件中导出的变量。
    我在这个schema.js文件内部进行了一次导入操作。
    正是这第二次导入操作导致了“无法在模块外使用import语句”的错误。
    最终,将文件名从schema.js重命名为schema.ts解决了这个问题。


    -1
    请将导入语句替换为以下代码行:
    const MongoClient = require('mongodb').MongoClient;
    

    -2
    "scripts": { "start": "babel-node server.js" } 对我来说,添加上述内容有效。

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