নোড.জেএস - সিনট্যাক্স এরির: অপ্রত্যাশিত টোকেন আমদানি


442

আমি বুঝতে পারি না ভুল কি। নোড 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
নোডেজগুলিতে আমদানি করতে বাবেলের মতো ট্রান্সপ্লেরার ব্যবহার করুন কারণ এটি নোডেজগুলিতে স্থানীয়ভাবে সমর্থিত নয় here আমদানির সর্বোত্তম বিকল্পটি তাই এটির সাথে যেতে হবে।
ভুবনেশ কুমার

উত্তর:


483

আপডেট 3: নোড 13 থেকে আপনি .mjs এক্সটেনশনটি ব্যবহার করতে পারেন বা আপনার প্যাকেজ.জেসনে "টাইপ": "মডিউল" সেট করতে পারেন। আপনি না ব্যবহার করতে হবে --experimental-modulesপতাকা।

আপডেট 2: নোড 12 থেকে আপনি .mjsএক্সটেনশনটি ব্যবহার করতে পারেন বা "type": "module"আপনার প্যাকেজ.জসনে সেট করতে পারেন । এবং আপনাকে --experimental-modulesপতাকা সহ নোড চালানো দরকার ।

আপডেট করুন: ইন নোড 9 , এটি একটি পতাকা পিছনে সক্রিয়, এবং ব্যবহার করা হয় .mjsএক্সটেনশান।

node --experimental-modules my-app.mjs

যদিও importপ্রকৃতপক্ষে ES6 এর অংশ, এটি দুর্ভাগ্যক্রমে এখনও ডিফল্টরূপে নোডজেএসে সমর্থিত নয় এবং ব্রাউজারগুলিতে খুব সাম্প্রতিককালে সমর্থনটি এসেছে।

এমডিএন এবং এই নোড ইস্যুতে ব্রাউজারের কমপ্যাট টেবিলটি দেখুন ।

নোড.জেএস (ফেব্রুয়ারী 2017) এর ইএস 6 মডিউলগুলির বিষয়ে জেমস এম স্নেলের আপডেট থেকে :

কাজ চলছে তবে এটি কিছুটা সময় নিতে চলেছে - আমরা বর্তমানে কমপক্ষে এক বছরের দিকে তাকিয়ে আছি।

সমর্থন স্থানীয়ভাবে প্রদর্শিত না হওয়া অবধি আপনার ক্লাসিক requireবিবৃতি ব্যবহার চালিয়ে যেতে হবে :

const express = require("express");

আপনি যদি সত্যিই নোডজেএসে নতুন ES6 / 7 বৈশিষ্ট্যগুলি ব্যবহার করতে চান তবে আপনি এটি ব্যাবেল ব্যবহার করে সংকলন করতে পারেন। এখানে একটি উদাহরণ সার্ভার


2
কেউ কি জানেন যে নোড 10 ডিফল্টরূপে সক্ষম হওয়া সমর্থন সহ শিপ করবে? (পরের মাসে অভিষেকের কারণে)
হার্টমুট

2
@ স্কিমোনস্টার ...... নোড - এক্সপেরিমেন্টাল-মডিউলগুলি আমার-অ্যাপ.এমজেএস (নোড: 12176) পরীক্ষামূলক সতর্কতা: ইএসএম মডিউল লোডার পরীক্ষামূলক। {ত্রুটি: সন্ধানে মডিউল / সি: / ব্যবহারকারী / উইটিপ্যারোট / ডকুমেন্টস / কার্ড-টেস্ট-প্রজেক্ট / এসআরসি / মাই-অ্যাপ.এমজেসগুলি খুঁজে পাওয়া যায় না (অভ্যন্তরীণ / মডিউল / এসএম / ডিফল্টরসোল.জেএস: 23: 12) পরীক্ষা-প্রকল্প / src / my-app.mjs সন্ধানে (অভ্যন্তরীণ / মডিউল / এসএম / DefaultResolve.js: 23: 12) .... সতর্কতা নিক্ষেপ করা আমার-app.js সন্ধান করতে পারেনি .... দয়া করে পরামর্শ দিন .... i 9.11.1 নোড সংস্করণ ইনস্টল করা হয়েছে
লিও

51
হতাশার কারণ সেখানে বেশিরভাগ টিউটোরিয়াল আমদানি ব্যবহারের কথা বলে, তবে এর পক্ষে প্রায় কোনও সমর্থন নেই। (আমি আমার জীবনের 2 ঘন্টা ফিরে ফিরে চাই)
কিউইকম্ব 1212

9
@ChaimEliyah: নোড v11.0.0 মধ্যে একই সমস্যা পেয়েছিলাম
whoami

5
এখনও V12 একটি পতাকা দরকার nodejs.org/api/esm.html#esm_ecmascript_modules
ABabin

60

দুর্ভাগ্যক্রমে, নোড.জেএস ইএস 6 এর importএখনও সমর্থন করে না ।

আপনি যা করার চেষ্টা করছেন তা অর্জন করতে (এক্সপ্রেস মডিউলটি আমদানি করুন), এই কোডটি যথেষ্ট should

var express = require("express");

এছাড়াও, নিশ্চিত হয়ে নিন যে আপনি চালিয়ে এক্সপ্রেস ইনস্টল করেছেন

$ npm install express

নোড.জেএস শেখার বিষয়ে আরও তথ্যের জন্য নোড.জেএস ডক্স দেখুন ।


8
importঅগত্যা টাইপস্ক্রিপ্টের একটি বৈশিষ্ট্য নয়। টাইপস্ক্রিপ্ট টাইপ সহ ES6। সুতরাং আমদানির মতো স্টাফগুলি ES6 নেটিভ।
বোরিসলেমকে

@ বোরিসলেমেকে সত্য, আমি ওপিকে কিছুটা ভুল ব্যাখ্যা করেছি। :) আমি এটা পরিবর্তন করব।
baranskistad

হাই, আমি এক্সপ্রেস ইনস্টল করেছি তবে স্ক্রিপ্টে প্যাকেজ.জসন ফাইলটিতে আমাদের কী লেখা উচিত? যদি আমি "স্ক্রিপ্টগুলি": {"শুরু": "নোড সূচক.js" লিখি write তবে এটির একই ত্রুটি প্রদর্শন করা উচিত। আমাকে সাহায্য করুন.
রবি শাহ

node index.jsআমার জন্য কাজ করে, কিন্তু যখন আমি দৌড়ান node dist/main.jsআমিও পাই Unexpected token import
TheFox

@TheFox আপনার সম্ভবত সেই ফাইলটিতে একটি আমদানি রয়েছে। কেবল আপনার index.jsপাস করার অর্থ এই নয় যে আপনার dist/main.jsইচ্ছাও পাস হবে।
বারানস্কিস্টাদ

34

অন্যান্য উত্তরে উল্লিখিত হিসাবে নোড জেএস বর্তমানে ইএস 6 আমদানি সমর্থন করে না।

(এখন পর্যন্ত, সম্পাদনা 2 পড়ুন)

নোড js এ ES6 আমদানি সক্ষম করুন এটি এই সমস্যার সমাধান সরবরাহ করে provides আমি এটি চেষ্টা করেছি এবং এটি আমার পক্ষে কাজ করেছে।

কমান্ডটি চালান:

    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

এখন, আপনার ফোল্ডারে যান যেখানে আপনার সার্ভার বা সূচি ফাইল উপস্থিত রয়েছে এবং ব্যাবেল-নোড ফাইলনাম.জেএস ব্যবহার করে চালান

অথবা আপনি npm startআপনার package.jsonফাইলটিতে নিম্নলিখিত কোড যুক্ত করে চালাতে পারেন :

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

আমি কীভাবে ইলেক্ট্রন দিয়ে এটি করব? আমি "start": "babel-node electron .",
এটির

2
@tpbafk আমি ইলেকট্রনে কাজ করি নি। তবে আমি আপনার সমস্যার জাভাস্ক্রিপ্টের অনুরূপ কিছু পেয়েছি - কীভাবে 'বাবেল-নোড - প্রিপ্রেসট এস2015, পর্যায় -3' দিয়ে বৈদ্যুতিন অ্যাপ্লিকেশনটির জন্য এনপিএম শুরু করবেন । আশা করি এটি সহায়তা করবে
নীড়লি আচার্য

33

ত্রুটি: সিনট্যাক্স এরর: অপ্রত্যাশিত টোকেন আমদানি বা সিনট্যাক্স এরিয়ার: অপ্রত্যাশিত টোকেন রফতানি


সমাধান: উদাহরণস্বরূপ আপনার সমস্ত আমদানি পরিবর্তন করুন

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
আমি আশা করি আপনি রফতানি ডিফল্ট অংশটি আরও কিছুটা ব্যাখ্যা করতে পারতেন। সেই অংশটি নিয়ে আমার সমস্যা হচ্ছে। আমদানি আপনার উত্তরের সাথে দুর্দান্ত কাজ করে।
জো গ্যালিন্ড

আমার উত্তরের আগে একটি উত্তর আছে যার একটি ব্যাখ্যা আছে। তবে স্পষ্টতার জন্য নোড ES6 সিনট্যাক্স সমর্থন করে না। আপনি যখন আমদানি বলবেন ... আপনি ES6 সিনট্যাক্স ব্যবহার করছেন
supritshah1289

22

আমি হতবাকের কথা esmবলা হয়নি। এই ছোট, তবে শক্তিশালী প্যাকেজটি আপনাকে হয় importবা ব্যবহার করতে দেয় require

আপনার প্রকল্পে এসএমএস ইনস্টল করুন

$ npm install --save 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কীওয়ার্ডটি ব্যবহার করার ক্ষেত্রে (যেমনটি সম্ভবত এটি সম্ভব) সত্য নয়
ড্যানিয়েল থম্পসন

@ ড্যানিয়েল টম্পসন দুঃখিত, এটি যদি কোনও ভুল বোঝাবুঝি হতে পারে তবে আমি এই মামলার জন্য কেবল একটি প্রস্তাব দিচ্ছি, যদি আপনি 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")

বা যদি আপনি এটি ক্লিমে চালান, আপনি প্রয়োজনীয় হুক -r @ বাবেল / রেজিস্ট্রার হিসাবে প্রাক্তন হিসাবে ব্যবহার করতে পারেন।

$node -r @babel/register executeMyFileWithESModules.js

1
@ বাবেল / প্রিসেট-এনভিটি ইনস্টল করা এবং এটি .belrc এ যুক্ত করা কৌশলটি তৈরি করে। আমার ক্ষেত্রে @ বাবেল / রেজিস্টার প্লাগইনের প্রয়োজন নেই।
মার্কোস আর

8

যদি আপনি 'বাবেল' ব্যবহার করতে পারেন তবে নীচে প্যাকেজ.জসনে (- প্রিসেটগুলি = এস ২০১৫) বিল্ড স্ক্রিপ্টগুলি যুক্ত করার চেষ্টা করুন। এটি es2015 এ আমদানি কোডটি পূর্ববর্তী করে তোলে

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

তবে আমার কলটি npm startকি প্রথমে "বিল্ড" করবে, বা প্রথমে "শুরু" করবে? ( "nodemon src/app.js --exec \"npm run lint && node\"",
শুরুটি

যদি আমি এই
সেন্টিমিডিটি

6

Node.js V12 এর হিসাবে (এবং এই সম্ভবত এখন তা বেশ স্থিতিশীল, কিন্তু এখনও হিসাবে চিহ্নিত "পরীক্ষামূলক"), আপনি ESM (ব্যবহার করার জন্য বিকল্প একটি দম্পতি আছে CMA এস cript এম (Node.js মধ্যে odules) ফাইল জন্য, একটি স্ট্রিংগুলি বিভক্ত করার তৃতীয় উপায়), এখানে ডকুমেন্টেশন যা বলে:

--experimental-modulesপতাকা নাম ECMAScript মডিউল (ইএস মডিউল) জন্য সমর্থন সক্ষম করতে ব্যবহার করা যেতে পারে।

একবার সক্ষম হয়ে গেলে, নোড.জেএস nodeপ্রাথমিক ইনপুট হিসাবে পাস করার সময়, বা importইএস মডিউল কোডের মধ্যে বিবৃতি দ্বারা রেফারেন্সের সময় নিম্নলিখিতগুলি ES মডিউল হিসাবে বিবেচনা করবে :

  • ফাইলগুলি শেষ হচ্ছে .mjs

  • শেষের .jsফাইলগুলি বা এক্সটেনশনহীন ফাইলগুলি যখন নিকটতম পিতামাত্ত package.jsonফাইলটিতে "type"একটি মান সহ শীর্ষ স্তরের ক্ষেত্র থাকে "module"

  • স্ট্রিংস একটি আর্গুমেন্ট হিসাবে পাস --evalবা --print, অথবা পাইপ nodeমাধ্যমে STDINপতাকা দিয়ে, --input-type=module

নোড.জেএসগুলি ইনপুটটির অন্যান্য সমস্ত ফর্মগুলি কমনজেএস হিসাবে বিবেচনা করবে, যেমন .jsফাইলগুলি যেখানে নিকটতম পিতামাত্ত package.jsonফাইলটিতে কোনও শীর্ষ-স্তরের "type" ক্ষেত্র বা পতাকা ছাড়াই স্ট্রিং ইনপুট থাকে না --input-type। এই আচরণটি পশ্চাদপদ সামঞ্জস্যতা সংরক্ষণ করা। তবে, এখন নোড.জেএস উভয়ই কমনজেএস এবং ইএস মডিউল সমর্থন করে, যখনই সম্ভব স্পষ্ট হওয়া ভাল। nodeপ্রাথমিক ইনপুট হিসাবে পাস করার সময়, বা importইএস মডিউল কোডের মধ্যে বিবৃতি দ্বারা রেফারেন্সের সময় নোড.জেএসগুলি নিম্নলিখিতটি সাধারণ জেএস হিসাবে বিবেচনা করবে :

  • ফাইলগুলি শেষ হচ্ছে .cjs

  • শেষের .jsফাইলগুলি বা এক্সটেনশনহীন ফাইলগুলি যখন নিকটতম পিতামাত্ত 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) এসএমএস : -

উজ্জ্বলভাবে সহজ, বাবেল-কম, বান্ডিল-কম 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 টিমনওয়েব ডট কমকে ধন্যবাদ

খ) সমাধান 2

বাবেল 6 ব্যবহার করুন ( বাবেল -প্রিসেট-স্টেজ -3 older 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 .babrc দ্বারা শুরু করা উচিত

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

প্যাকেজ.জসনে কিছু পরিবর্তন

"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 প্রতিটি পরিবর্তন তারপর ডেভলপমেন্ট সার্ভার হিসাবে ব্যবহার করুন প্রতিটি পরিবর্তন নোডেমনে আরও স্বয়ংক্রিয়ভাবে পুনরায় চালু করুন


2

আমার ক্ষেত্রে এটি .babelrcফাইল দেখাশোনা করছিল এবং এর মধ্যে এমন কিছু থাকা উচিত:

{
  "presets": ["es2015-node5", "stage-3"],
  "plugins": []
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.