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

时间:2020-02-25 10:53:33

标签: node.js mongodb typescript express next.js

我正在将NextJS与打字稿,mongo Atlas,mongoose,node和express一起使用。

运行节点页面/服务器时出现以下错误: 我已经上传了package.json文件,并且还添加了babel

从“ express”进口快递; ^^^^^^

SyntaxError:无法在模块外部使用import语句 在wrapSafe(内部/模块/cjs/loader.js:1072:16) 在Module._compile(内部/模块/cjs/loader.js:1122:27) 在Object.Module._extensions..js(内部/模块/cjs/loader.js:1178:10) 在Module.load(internal / modules / cjs / loader.js:1002:32) 在Function.Module._load(internal / modules / cjs / loader.js:901:14) 在Function.executeUserEntryPoint [作为runMain](内部/模块/run_main.js:74:12) 在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"
}

5 个答案:

答案 0 :(得分:6)

从Node v12开始,您可以使用.mjs扩展名,也可以在"type": "module"中设置package.json

您需要使用--experimental-modules标志运行节点。

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,用于在介质上设置具有Custom Express Server + Typescript的Next.js,对您非常有帮助。

答案 1 :(得分:3)

以下解决方案对我有用;

  • 安装所需的软件包

    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 是您的文件。

希望它能起作用:)

答案 2 :(得分:1)

我遇到了同样的错误“语法错误:无法在模块外使用导入语句”,首先我添加了 tye : 模块,但仍然面临另一个错误。最后它对我的工作问题是我正在运行我的 Driver.js 文件,为什么我会遇到这个问题。我运行我的 Driver.ts 文件,它对我来说工作正常。 enter image description here

但是在运行我的扩展名 .ts 文件之后它的工作。 enter image description here

答案 3 :(得分:0)

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

 npm i --save ts-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"

答案 4 :(得分:-1)

“脚本”:{ “ start”:“ babel-node server.js” }

添加以上内容对我有用