Как исправить ошибку «ReferenceError: требование не определено» при компиляции с помощью «—experimental-modules»?

#javascript #node.js #require

#node.js

Вопрос:

internal.mjs:

 import request from 'request-promise-native'

const rocketChatServer = 'http://localhost:3000';
const rocketChatAdminUserId = 'aobEdbYhXfu5hkeqG';
const rocketChatAdminAuthToken = '9HqLlyZOugoStsXCUfD_0YdwnNnunAJF8V47U3QHXSq';

export async function fetchUser (username) {
  const rocketChatUser = await request({
    url: `${rocketChatServer}/api/v1/users.info`,
    method: 'GET',
    qs: {
      username: username
    },
    headers: {
      'X-Auth-Token': rocketChatAdminAuthToken,
      'X-User-Id': rocketChatAdminUserId
    }
  });
  return rocketChatUser;
}

export async function loginUser (email, password) {
  const response = await request({
    url: `${rocketChatServer}/api/v1/login`,
    method: 'POST',
    json: {
      user: email,
      password: password
    }
  });
  return response;
}

export async function createUser(username, name, email, password) {
  const rocketChatUser = await request({
    url: `${rocketChatServer}/api/v1/users.create`,
    method: 'POST',
    json: {
      name,
      email,
      password,
      username,
      verified: true
    },
    headers: {
      'X-Auth-Token': rocketChatAdminAuthToken,
      'X-User-Id': rocketChatAdminUserId
    }
  });
  return rocketChatUser;
}

export async function createOrLoginUser (username, name, email, password,) {
  try {
    const user = await fetchUser(username);
    // Perfom login
    return await loginUser(email, password);
  } catch (ex) {
    if (ex.statusCode === 400) {
      // User does not exist, creating user
      const user = await createUser(username, name, email, password);
      // Perfom login
      return await loginUser(email, password);
    } else {
      throw ex;
    }
  }
}
  

external.mjs:

 import { createOrLoginUser } from './internal.mjs';

var express = require('express');
var app = express();
app.post('/login', async (req, res) => {
// ....CODE TO LOGIN USER
    // Creating or login user into Rocket chat 
   try {
    const response = await createOrLoginUser(user.username, user.firstName, user.email, user.password);
    req.session.user = user;
    // Saving the rocket.chat auth token and userId in the database
    user.rocketchatAuthToken = response.data.authToken;
    user.rocketchatUserId = response.data.userId;
    await user.save();
    res.send({ message: 'Login Successful'});
   } catch (ex) {
     console.log('Rocket.chat login failed');
   }
})
  

Вывод:

 me@test:~/node$ node --experimental-modules external.mjs
(node:7482) ExperimentalWarning: The ESM module loader is experimental.
ReferenceError: require is not defined
    at file:///home/me/node/external.mjs:3:15
    at ModuleJob.run (internal/loader/ModuleJob.js:94:14)
    at <anonymous>
  

Внезапно мне пришлось иметь дело с node.js для некоторого тестирования, и я не испытывал node.js раньше.

Я не думаю, что у internal.mjs есть какие-либо проблемы, поскольку он не показывает ошибки при выполнении команды «node —experimental-modules internal.mjs». Но запуск его для external.mjs выдает ошибку, и я не мог решить ее в течение многих часов.

Как я могу решить эту ошибку, чтобы она компилировалась?

Комментарии:

1. nodejs.org/api/…

2. Измените require для импорта, если вы используете mjs-файл.

Ответ №1:

Если вы собираетесь использовать новые модули ESM, не используйте require , импортируйте express :

Изменить:

 var express = require('express');
  

Для

 import express from 'express';
  

Комментарии:

1. Это сделало это. Спасибо.