Node.js - SyntaxError: अप्रत्याशित टोकन आयात


443

मुझे समझ नहीं आया कि क्या गलत है। नोड v5.6.0 एनपीएम v3.10.6

कोड:

function (exports, require, module, __filename, __dirname) {
    import express from 'express'
};

त्रुटि:

SyntaxError: Unexpected token import
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:387:25)
    at Object.Module._extensions..js (module.js:422:10)
    at Module.load (module.js:357:32)
    at Function.Module._load (module.js:314:12)
    at Function.Module.runMain (module.js:447:10)
    at startup (node.js:140:18)
    at node.js:1001:3

4
नोडेल में आयात का उपयोग करने के लिए बैबेल जैसे ट्रांसपिलर का उपयोग करें क्योंकि यह मूल रूप से नोडजेस में समर्थित नहीं है। आयात का सबसे अच्छा विकल्प है इसलिए इसके साथ जाने की आवश्यकता होती है।
BHUVNESH कुमार

जवाबों:


484

अपडेट 3: नोड 13 के बाद से , आप या तो .mjs एक्सटेंशन का उपयोग कर सकते हैं, या अपने पैकेज में "टाइप": "मॉड्यूल" सेट कर सकते हैं। Json। आपको ध्वज का उपयोग करने की आवश्यकता नहीं है --experimental-modules

अद्यतन 2: नोड 12 के बाद से , आप या तो .mjsएक्सटेंशन का उपयोग कर सकते हैं , या "type": "module"अपने पैकेज में सेट कर सकते हैं । Json। और आपको --experimental-modulesध्वज के साथ नोड चलाने की आवश्यकता है ।

अपडेट: में नोड 9 , यह एक ध्वज के पीछे सक्रिय है, और का उपयोग करता है .mjsविस्तार।

node --experimental-modules my-app.mjs

जबकि importवास्तव में ES6 का हिस्सा है, यह दुर्भाग्य से डिफ़ॉल्ट रूप से NodeJS में अभी तक समर्थित नहीं है, और केवल हाल ही में ब्राउज़रों में समर्थन में उतरा है।

MDN और इस नोड समस्या पर ब्राउज़र कंप्रेशर टेबल देखें ।

Node.js में ES6 मॉड्यूल पर जेम्स एम स्नेल के अपडेट से (फरवरी 2017):

कार्य प्रगति पर है लेकिन इसमें कुछ समय लगने वाला है - हम वर्तमान में लगभग एक वर्ष में देख रहे हैं।

जब तक समर्थन मूल रूप से नहीं दिखता है, तब तक आपको क्लासिक requireस्टेटमेंट का उपयोग जारी रखना होगा :

const express = require("express");

यदि आप वास्तव में NodeJS में नए ES6 / 7 सुविधाओं का उपयोग करना चाहते हैं, तो आप इसे Babel का उपयोग करके संकलित कर सकते हैं। यहाँ एक उदाहरण सर्वर है


2
किसी को पता है अगर नोड 10 डिफ़ॉल्ट रूप से सक्षम समर्थन के साथ जहाज जाएगा? (अगले महीने पदार्पण के कारण)
हार्टमुट

2
@Scimonster ...... नोड --experimental- मॉड्यूल my-app.mjs (नोड: 12176) एक्सपेरिमेंटलवेयर: ESM मॉड्यूल लोडर प्रयोगात्मक है। {त्रुटि: खोज में आंतरिक (मॉड्यूल / मॉड्यूल / esm / DefaultResolve.js: 23: 12) परीक्षण-प्रोजेक्ट / मॉड्यूल / सी :/Users/WittyParrot/Documents/card-test-project/src/my-app.mjs नहीं मिल सकता है। खोज (आंतरिक / मॉड्यूल / esm / DefaultResolve.js: 23: 12) पर src / my-app.mjs .... एक चेतावनी फेंकने से my-app.js नहीं मिल सका .... कृपया सुझाव दें .... i स्थापित नोड संस्करण 9.11.1
सिंह

52
निराशा इसलिए कि बहुसंख्यक ट्यूटोरियल आयात का उपयोग करने की बात करते हैं, लेकिन इसके लिए लगभग कोई समर्थन नहीं है। (मैं अपने जीवन के 2 घंटे वापस
लोल

9
@ChaimEliyah: नोड v11.0.0 में वही मुद्दा मिला
whoami

5
फिर भी v12 में एक ध्वज की आवश्यकता है। netjs.org/api/esm.html#esm_ecmascript_modules
ABabin

60

दुर्भाग्य से, Node.js ES6 का importअभी तक समर्थन नहीं करता है।

यह सुनिश्चित करने के लिए कि आप क्या करना चाहते हैं (एक्सप्रेस मॉड्यूल आयात करें), इस कोड को पर्याप्त होना चाहिए

var express = require("express");

इसके अलावा, सुनिश्चित करें कि आपने एक्सप्रेस को इंस्टॉल किया है

$ npm install express

Node.js सीखने के बारे में अधिक जानकारी के लिए Node.js डॉक्स देखें


8
importजरूरी नहीं कि टाइपस्क्रिप्ट की एक विशेषता है। टाइपस्क्रिप्ट ES6 टाइपिंग के साथ है। तो आयात की तरह सामान ES6 देशी है।
बोरिसलेमके

@borislemke सच है, मैंने ओपी की व्याख्या थोड़ी गलत की। :) मैं इसे बदल दूँगा।
बारसंस्तिद

नमस्ते, मैं एक्सप्रेस स्थापित है, लेकिन package.json फ़ाइल की स्क्रिप्ट में हमें क्या लिखना चाहिए? यदि मैं "स्क्रिप्ट्स": {"स्टार्ट": "नोड इंडेक्स.जेएस"} लिखता हूं, तो उसे वही त्रुटि प्रदर्शित करनी चाहिए। क्रिप्या मेरि सहायता करे।
रवि शाह

node index.jsमेरे लिए काम करता है, लेकिन जब मैं दौड़ता node dist/main.jsहूं तो मुझे भी मिलता है Unexpected token import
TheFox

@ उस फ़ाइल में आपके पास शायद एक आयात है। सिर्फ इसलिए कि आपका index.jsगुजर रहा है इसका मतलब यह नहीं है कि आपका dist/main.jsभी गुजर जाएगा।
बरकिनस्टैड

34

जैसा कि अन्य उत्तरों में उल्लेख किया गया है कि नोड जेएस वर्तमान में ईएस 6 आयातों का समर्थन नहीं करता है।

(अभी तक, EDIT 2 पढ़ें)

नोड js में ES6 आयात सक्षम करें इस समस्या का समाधान प्रदान करता है। मैंने यह कोशिश की है और इसने मेरे लिए काम किया है।

कमांड चलाएँ:

    npm install babel-register babel-preset-env --save-dev

अब आपको एक नई फ़ाइल (config.js) बनाने की आवश्यकता है और इसमें निम्न कोड जोड़ें।

    require('babel-register')({
        presets: [ 'env' ]
    })
    // Import the rest of our application.
    module.exports = require('./your_server_file.js')

अब आप बिना किसी त्रुटि के आयात विवरण लिख सकते हैं।

उम्मीद है की यह मदद करेगा।

संपादित करें:

आपको नई फ़ाइल चलाने की आवश्यकता है जो आपने उपरोक्त कोड के साथ बनाई थी। मेरे मामले में यह था config.js। इसलिए मुझे भागना होगा:

    node config.js

संपादित करें 2:

प्रयोग करते समय, मुझे इस मुद्दे का एक आसान समाधान मिला।

.babelrcअपने प्रोजेक्ट के मूल में फ़ाइल बनाएँ ।

निम्नलिखित जोड़ें (और आपकी आवश्यकता के किसी भी अन्य बेबल प्रीसेट को इस फाइल में जोड़ा जा सकता है):

    {
        "presets": ["env"]
    }

स्थापित करें babel-preset-envआदेश का उपयोग npm install babel-preset-env --saveकरें, और तब स्थापित babel-cliआदेश का उपयोगnpm install babel-cli -g --save

अब, उस फ़ोल्डर पर जाएं जहां आपका सर्वर या इंडेक्स फाइल मौजूद है और उपयोग कर चलाएं: babel-node fileName.js

या आप npm startअपनी package.jsonफ़ाइल में निम्न कोड जोड़कर उपयोग कर सकते हैं :

    "scripts": {
        "start": "babel-node src/index.js"
    }

मैं इलेक्ट्रॉन के साथ यह कैसे करूं? मैंने इस तरह की कोशिश की: "start": "babel-node electron .", लेकिन कोई भाग्य नहीं
tpbafk

2
@tpbafk मैंने इलेक्ट्रॉन पर काम नहीं किया है। लेकिन मुझे आपकी समस्या जावास्क्रिप्ट के समान कुछ मिला - 'babel-node --presets es2015, stage-3' के साथ इलेक्ट्रॉन ऐप के लिए npm की शुरुआत कैसे करें । आशा है कि यह मदद करता है
नीराली आचार्य

33

त्रुटि: SyntaxError: अप्रत्याशित टोकन आयात या SyntaxError: अप्रत्याशित टोकन निर्यात


समाधान: अपने सभी आयातों को उदाहरण के रूप में बदलें

const express               = require('express');
const webpack               = require('webpack');
const path                  = require('path');
const config                = require('../webpack.config.dev');
const open                  = require('open');

और अपने export default = foo;को भी बदलोmodule.exports = foo;


1
काश, आपने निर्यात डिफ़ॉल्ट हिस्से को थोड़ा और समझाया होता। मुझे उस हिस्से से परेशानी हो रही है। आयात आपके उत्तर के साथ शानदार काम करता है।
--गिंद

मेरे उत्तर से पहले एक उत्तर है जिसमें स्पष्टीकरण है। लेकिन स्पष्टीकरण के लिए नोड ईएस 6 सिंटैक्स का समर्थन नहीं करता है। जब आप कहते हैं कि आयात ... आप ES6 सिंटैक्स का उपयोग कर रहे हैं
supritshah1289

22

मैं हैरान हूँ esmउल्लेख नहीं किया गया है। यह छोटा, लेकिन शक्तिशाली पैकेज आपको importया तो उपयोग करने की अनुमति देता है या require

अपने प्रोजेक्ट में एसम स्थापित करें

$ npm install --save esm

Esm का उपयोग करने के लिए अपने नोड प्रारंभ स्क्रिप्ट को अपडेट करें

node -r esm app.js

esmबस काम करता है। मैंने समय का एक टन बर्बाद कर दिया .mjsऔर --experimental-modulesकेवल यह पता लगाने के लिए .mjsकि एक फ़ाइल का उपयोग requireया आयात करने वाली फ़ाइल को आयात नहीं किया जा सकता है module.exports। यह एक बहुत बड़ी समस्या थी, जबकि esmआपको मिक्स एंड मैच करने की अनुमति है और यह सिर्फ इसका आंकलन करता है ... esmबस काम करता है।


17

इस मामले में कि आप अभी भी "आयात" का उपयोग नहीं कर सकते हैं यहां बताया गया है कि मैंने इसे कैसे संभाला है: बस इसे नोड अनुकूल आवश्यकता के लिए अनुवाद करें। उदाहरण:

import { parse } from 'node-html-parser';

के समान है:

const parse = require('node-html-parser').parse;

4
सच नहीं अगर आप exportकीवर्ड का उपयोग कर रहे हैं (जैसा कि मामला है)
डैनियल थॉम्पसन

@DanielThompson क्षमा करें यदि यह गलतफहमी हो सकती है, तो मैं इस मामले के लिए केवल वर्कअराउंड दे रहा हूं, यदि आप exportकीवर्ड के बिना काम करते हैं , वैसे भी आपके उपयोगी नोट के लिए धन्यवाद!
अल्बर्टो

मेरे लिए काम करना। साभार
अली अजहर

11

बाबेल 7 प्रस्ताव में आप देव निर्भरता जोड़ सकते हैं

npm i -D @babel/core @babel/preset-env @babel/register

और जड़ में एक .babelrc जोड़ें

{
"presets": [
  [
    "@babel/preset-env",
    {
      "targets": {
        "node": "current"
     }
    }
  ]
 ]
}

और .js फ़ाइल में जोड़ें

require("@babel/register")

या यदि आप इसे cli में चलाते हैं, तो आप आवश्यक हुक का उपयोग कर सकते हैं -r @ babel / register, ex।

$node -r @babel/register executeMyFileWithESModules.js

1
@ Babel / preset-env को इनस्टॉल कर रहा है और इसे .babelrc में जोड़कर ट्रिक बनाई है। मेरे मामले में @ babel / रजिस्टर प्लगइन की कोई आवश्यकता नहीं है।
मार्कोस आर

8

यदि आप 'कोलाहल' का उपयोग कर सकते हैं, तो नीचे के रूप में package.json (- presets = es2015) में स्क्रिप्ट बनाने का प्रयास करें। यह es2015 के लिए आयात कोड precompile करने के लिए बनाते हैं

"build": "babel server --out-dir build --presets=es2015 && webpack"

लेकिन क्या मेरा फोन npm startपहले "बिल्ड" करने के लिए होगा, या पहले "स्टार्ट" करने के लिए? (वर्तमान में परिभाषित किया गया है:"nodemon src/app.js --exec \"npm run lint && node\"",
pashute

अगर मैं इस cmd को चलाता हूं, तो यह दिखाता है कि सर्वर में त्रुटि नहीं है
कुमारसन_sd

6

Node.js v12 के रूप में (और यह शायद अब काफी स्थिर है, लेकिन अभी भी "प्रयोगात्मक" चिह्नित है), आपके पास Node.js (फ़ाइलों के लिए) में ESM ( E CMA S cript M odules) का उपयोग करने के लिए कुछ विकल्प हैं। तार निकालने के लिए तीसरा तरीका), यहाँ प्रलेखन क्या कहता है:

--experimental-modulesझंडा ECMAScript मॉड्यूल (ईएस मॉड्यूल) के लिए समर्थन सक्षम करने के लिए इस्तेमाल किया जा सकता।

एक बार सक्षम होने पर, नोड.जेएस निम्नलिखित ईएस मॉड्यूल के रूप में व्यवहार करेगा जब nodeप्रारंभिक इनपुट के रूप में पारित किया जाता है, या जब importक्वालिटी मॉड्यूल कोड के भीतर बयानों द्वारा संदर्भित किया जाता है :

  • में समाप्त होने वाली फाइलें .mjs

  • फ़ाइलों के अंत में .js, या extensionless फ़ाइलें, जब निकटतम माता पिता package.jsonफ़ाइल एक शीर्ष स्तर फ़ील्ड "type"के मान के साथ "module"

  • तार करने के लिए एक तर्क के रूप में पारित कर दिया --evalया --print, या करने के लिए पहुंचाया nodeके माध्यम से STDINध्वज के साथ, --input-type=module

Node.js सभी अन्य प्रकार के इनपुट के रूप में कॉमनजेएस के रूप में व्यवहार करेगा, जैसे .jsकि निकटतम पैरेंट package.jsonफ़ाइल में "type" झंडे के बिना कोई शीर्ष-स्तरीय फ़ील्ड या स्ट्रिंग इनपुट नहीं है --input-type। यह व्यवहार पिछड़ी संगतता को संरक्षित करने के लिए है। हालाँकि, अब जब Node.js कॉमनज और ES मॉड्यूल दोनों का समर्थन करता है, तो जब भी संभव हो स्पष्ट होना सबसे अच्छा है। जब नोड nodeप्रारंभिक इनपुट के रूप में पारित हो , या जब importईएस मॉड्यूल कोड के भीतर बयानों द्वारा संदर्भित किया जाता है, तो Node.js कॉमनजस के रूप में निम्नलिखित का इलाज करेंगे :

  • में समाप्त होने वाली फाइलें .cjs

  • फ़ाइलों के अंत में .js, या extensionless फ़ाइलें, जब निकटतम माता पिता package.jsonफ़ाइल एक शीर्ष स्तर फ़ील्ड "type"के मान के साथ "commonjs"

  • तार करने के लिए एक तर्क के रूप में पारित कर दिया --evalया --print, या करने के लिए पहुंचाया nodeके माध्यम से STDINध्वज के साथ, --input-type=commonjs


3

जब मैं एक्सप्रेस के साथ शुरू किया गया था तो हमेशा आवश्यकता के बजाय आयात का उपयोग करने के लिए एक समाधान चाहता था

const express = require("express");
// to 
import express from "express"

कई बार इस लाइन से गुजरते हैं: - Unfortunately, Node.js doesn't support ES6's import yet.

अब अन्य की मदद के लिए मैं यहां दो नए समाधान तैयार कर रहा हूं

1) esm : -

शानदार ढंग से सरल, बेबल-कम, बंडल-कम ECMAScript मॉड्यूल लोडर। चलो इसे काम करते हैं

  yarn add esm / npm install esm

start.js बनाएं या अपने नामस्थान का उपयोग करें

 require = require("esm")(module/*, options*/)
 // Import the rest of our application.
 module.exports = require('./src/server.js')
 // where server.js is express server start file

के अपने package.josnपास पथ में बदलेंstart.js

  "scripts": {
    "start": "node start.js",
    "start:dev": "nodemon start.js",
  },
  "dependencies": {
+    "esm": "^3.2.25",
  },
  "devDependencies": {
+   "nodemon": "^1.19.2"
  }

2) बबेल जेएस : -

इसे 2 भाग में विभाजित किया जा सकता है

a) समाधान 1 timonweb.com के लिए धन्यवाद

बी) समाधान 2

उपयोग कोलाहल 6 (के पुराने संस्करण कोलाहल-पूर्व निर्धारित चरण -3 ^ 6.0 बनाने) .babelrcअपने रूट फ़ोल्डर में फ़ाइल

{
    "presets": ["env", "stage-3"]
}

बैबल-प्रीसेट-स्टेज -3 स्थापित करें

yarn add babel-cli babel-polyfill babel-preset-env bable-preset-stage-3 nodemon --dev

Package.json में बदलें

"scripts": {
+   "start:dev": "nodemon --exec babel-node -- ./src/index.js",
+   "start": "npm run build && node ./build/index.js",
+   "build": "npm run clean && babel src -d build -s --source-maps --copy-files",
+   "clean": "rm -rf build && mkdir build"
},
"devDependencies": {
+    "babel-cli": "^6.26.0",
+    "babel-polyfill": "^6.26.0",
+    "babel-preset-env": "^1.7.0",
+    "babel-preset-stage-3": "^6.24.1",
+    "nodemon": "^1.19.4"
},

अपना सर्वर शुरू करें

yarn start / npm start

ऊह नहीं हम नई समस्या पैदा करते हैं

regeneratorRuntime.mark(function _callee(email, password) {
^
ReferenceError: regeneratorRuntime is not defined

यह त्रुटि केवल तब आती है जब आप अपने कोड में async / प्रतीक्षा का उपयोग करते हैं। फिर पॉलीफिल का उपयोग करें जिसमें एक कस्टम रीजनरेटर रनटाइम और कोर-जेएस शामिल हैं। के ऊपर जोड़ेंindex.js

import "babel-polyfill"

यह आपको async / प्रतीक्षा का उपयोग करने की अनुमति देता है

उपयोग 7 का

अपने प्रोजेक्ट में हर बात को आगे बढ़ाने की जरूरत है, बबेल 7 .babelrc से शुरू करें

{
  "presets": ["@babel/preset-env"]
}

पैकेज में कुछ बदलाव। Json

"scripts": {
+  "start:dev": "nodemon --exec babel-node -- ./src/index.js",
+  "start": "npm run build && node ./build/index.js",
+  "build": "npm run clean && babel src -d build -s --source-maps --copy-files",
+  "clean": "rm -rf build && mkdir build",
    ....
}
"devDependencies": {
+   "@babel/cli": "^7.0.0",
+   "@babel/core": "^7.6.4",
+   "@babel/node": "^7.0.0",
+   "@babel/polyfill": "^7.0.0",
+   "@babel/preset-env": "^7.0.0",
+   "nodemon": "^1.19.4"
....
}

और import "@babel/polyfill"प्रारंभ बिंदु पर उपयोग करें

import "@babel/polyfill"
import express from 'express'
const app = express()

//GET request
app.get('/', async (req, res) {
  // await operation
  res.send('hello world')
})
app.listen(4000, () => console.log('🚀 Server listening on port 400!'))

क्या आप सोच रहे हैं क्यों start:dev

गंभीरता से। आप नए हैं तो यह अच्छा सवाल है। प्रत्येक परिवर्तन शुरू सर्वर के साथ सूअर हर बार तो कर रहे हैं का उपयोग करें yarn start:devके बारे में अधिक के लिए हर बदलाव पुनः आरंभ सर्वर स्वचालित रूप से विकास सर्वर के रूप में nodemon


2

मेरे मामले में यह .babelrcफ़ाइल के बाद देख रहा था , और इसमें कुछ इस तरह होना चाहिए:

{
  "presets": ["es2015-node5", "stage-3"],
  "plugins": []
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.