سلام خسته نباشید من در قسمت 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...
سلام دوست عزیز.
خیر متاسفانه نمیشه از هردو استفاده کرد.
باید نسخه های قدیمیش که تایپ require ساپورت میکنه استفاده کنید
پیشنهاد میکنم از axios استفاده کنید خیلی بهتره و قابلیت های بیشتری داره. البته بخاطر همین قضایای تایپ ماژول و این چیزا باید به صورت دیفالت axios رو ایمپورت کنید
const axios = require("axios").default
در غیر اینصورت باید از تایپ ماژول استفاده کنید
خیلی ممنون از راهنماییتون من 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)
سلام دوست من
به این صورت پیاده سازی کن ببین مشکلت برطرف میشه
axios.post(
verifyUrl,
{},
{
headers: {
"Content-Type": "application/x-www-form-urlencoded; charset=utf-8"
},
},
);
سلام دوست عزیز.
دقت کنید که axios رو به صورت دیفالت require کنید دوست عزیز. یعنی به این شکل.
const axios = require("axios").default