• 1402/06/23

ارور ReferenceError: require is not defined in ES module scope :

سلام خسته نباشید من در قسمت 85 captcha وقی خواستم که از node-fetch استفاده کنم فهمیدم که دیگه از require پشتیبانی نمیکنه و باید import کرد ولی به ارور برخورد کردم و باید توی package.json گزینه type: module رو قرار میدادم و درست شد اما ارور داد که از require نمیشه استفاده کرد الان یعنی ما نمیتونیم در برنامه اییی که مینویسیم هم از require و import باهم استتفاده کنیم؟ 

قطعه کد: 

const passport = require('passport');
import fetch from 'node-fetch';

const User = require('../models/User');

exports.handleLogin = async (req, res, next) => {

    console.log(req.body["g-recaptcha-response"]);

    if (!req.body["g-recaptcha-response"]) {
        req.flash("error", "اعتبار سنجی captcha الزامی میباشد");
        return res.redirect("/users/login");
    }

    const secretkey = process.env.CAPTCHA_SECRET;
    const verifyUrl = `https://google.com/recaptcha/api/siteverify?secret=${secretkey}&response=${req.body["g-recaptcha-response"]}
    &remoteip=${req.connection.remoteAddress}`;

    const response = await fetch(verifyUrl, {
        method: "POST",
        headers: {
            Accept: "application/json",
            "Content-Type": "application/x-www-form-urlencoded; charset=utf-8"
        },
    });

    const json = await response.json();

    console.log(json);

    if (json.success) {
        passport.authenticate("local", {
            // successRedirect: "/dashboard",
            failureRedirect: "/users/login",
            failureFlash: true,
        })(req, res, next);
    } else {
        req.flash("error", "مشکلی در اعتبار سنجی captcha هست");
        res.redirect("/users/login");
    }
}

error:

file:///C:/Users/lenovo/Desktop/weblog/app.js:1
const debug = require('debug')("weblog-project");
              ^

ReferenceError: require is not defined in ES module scope, you can 
use import instead
This file is being treated as an ES module because it has a '.js' file extension and 'C:\Users\lenovo\Desktop\weblog\package.json' contains "type": "module". To treat it as a CommonJS script, rename it to use the '.cjs' file extension.
    at file:///C:/Users/lenovo/Desktop/weblog/app.js:1:15
    at ModuleJob.run (node:internal/modules/esm/module_job:217:25) 
    at async ModuleLoader.import (node:internal/modules/esm/loader:308:24)
    at async loadESM (node:internal/process/esm_loader:42:7)       
    at async handleMainPromise (node:internal/modules/run_main:66:12)

Node.js v20.6.1
[nodemon] app crashed - waiting for file changes before starting...
  • 1402/06/23
  • ساعت 10:04

سلام دوست عزیز.

خیر متاسفانه نمیشه از هردو استفاده کرد.

باید نسخه های قدیمیش که تایپ require ساپورت میکنه استفاده کنید

پیشنهاد میکنم از axios استفاده کنید خیلی بهتره و قابلیت های بیشتری داره. البته بخاطر همین قضایای تایپ ماژول و این چیزا باید به صورت دیفالت axios رو ایمپورت کنید

const axios = require("axios").default

در غیر اینصورت باید از تایپ ماژول استفاده کنید


  • 1402/06/24
  • ساعت 00:53

خیلی ممنون از راهنماییتون من axios رو نصب کردم ولی وقتی ازش استفاده کردم به این ارور برخورد کردم 

کدها:

const axios = require('axios');
const passport = require('passport');

const User = require('../models/User');
exports.handleLogin = async (req, res, next) => {

    console.log(req.body["g-recaptcha-response"]);

    if (!req.body["g-recaptcha-response"]) {
        req.flash("error", "اعتبار سنجی captcha الزامی میباشد");
        return res.redirect("/users/login");
    }

    const secretkey = process.env.CAPTCHA_SECRET;
    const verifyUrl = `https://google.com/recaptcha/api/siteverify?secret=${secretkey}&response=${req.body["g-recaptcha-response"]}
    &remoteip=${req.connection.remoteAddress}`;

    const response = await axios(
        verifyUrl, 
        {
        method: "POST",
        headers: {
            Accept: "application/json",
            "Content-Type": "application/x-www-from-urlencoded; charset=utf-8",
        },
    });
    
    const json = await response.json();

    console.log(json);

    if (json.success) {
        passport.authenticate("local", {
            // successRedirect: "/dashboard",
            failureRedirect: "/users/login",
            failureFlash: true,
        })(req, res, next);
    } else {
        req.flash("error", "مشکلی در اعتبار سنجی captcha هست");
        res.redirect("/users/login");
    }
}

error:

error: uncaughtException: Request failed with status code 400
AxiosError: Request failed with status code 400
    at settle (C:\Users\lenovo\Desktop\weblog\node_modules\axios\dist\node\axios.cjs:1913:12)
    at Unzip.handleStreamEnd (C:\Users\lenovo\Desktop\weblog\node_modules\axios\dist\node\axios.cjs:2995:11)   
    at Unzip.emit (node:events:526:35)
    at endReadableNT (node:internal/streams/readable:1376:12)
    at process.processTicksAndRejections (node:internal/process/task_queues:82:21)

  • 1402/06/26
  • ساعت 13:53

سلام دوست من

به این صورت پیاده سازی کن ببین مشکلت برطرف میشه

axios.post(
  verifyUrl,
  {},
  {
    headers: {
      "Content-Type": "application/x-www-form-urlencoded; charset=utf-8"
    },
  },
);

  • 1402/06/27
  • ساعت 12:55

سلام دوست عزیز.

دقت کنید که axios رو به صورت دیفالت require کنید دوست عزیز. یعنی به این شکل.

const axios = require("axios").default

 


logo-enamadlogo-samandehi