Ошибка типа: writeSource не является функцией

#javascript #import #module

Вопрос:

Я использую require для импорта 3 файлов с почти одинаковым кодом, но один из них (writeToSource.js) не работает. Я думал, что даю неправильные аргументы функции, но когда я проверил, все правильно. Что я могу сделать? Я получаю эту ошибку:

 TypeError: writeSource is not a function
    at Request._callback (/home/nika/Desktop/Girchi/Media-Girchi/assets/components/scrapOn.js:35:11) 
 

Основной файл JavaScript:

 const request = require('request');
const cheerio = require('cheerio');
const writeDataToGirchi = require('./writeDataToGirchi');
const writeDataToImportants = require('./writeDataToImportants');
const writeToSource = require('./writeToSource');

function scrapOn(url, accept, accept1, sourceImgUrl) {
  try {
    request(url, (error, response, html) => {
      if (!error amp;amp; response.statusCode == 200) {
        const $ = cheerio.load(html);

        const title = $('.article-title').text();
        const dataInfo = $('.date').first().text();
        const text = $('.article-body').text();
        const imgUrl = `https:${$('.global-figure-image  ').attr("src")}`;

        const writeGirchi = writeDataToGirchi("on.json", title, dataInfo, text, imgUrl, sourceImgUrl, url);
        const writeImportants = writeDataToImportants("on.json", title, dataInfo, text, imgUrl, sourceImgUrl, url);
        const writeSource = writeToSource("on.json", "On", title, dataInfo, text, imgUrl, sourceImgUrl, url);


        if (accept === "on" amp;amp; accept1 === "on") {
          writeGirchi();
          writeImportants();
          writeSource();
        } else if (accept === "on") {
          writeImportants();
          writeSource();
        } else if (accept1 === "on") {
          writeGirchi();
          writeSource();
        } else {
          writeSource();
        }
      }
    });
  } catch (err) {
    console.log(err);
  }
}
 

writeToSource.js файл:

 const fs = require('fs');

function writeToSource(fileName, name, title, dataInfo, text, imgUrl, sourceImgUrl, url) {
  fs.readFile(`./assets/data/${fileName}`, (err, data) => {
    if (err) throw err;
    let newsData = JSON.parse(data);
    newsData[dataInfo] = {
      ...newsData[dataInfo],
      source: name,
      title: title,
      text: text,
      link: url,
      logo: sourceImgUrl,
      articleDate: dataInfo,
      imgUrl: imgUrl,
      important: false,
      fileName: fileName
    };
    newsData = JSON.stringify(newsData)
    fs.writeFileSync(`./assets/data/${fileName}`, newsData, (error) => {
      if (error) console.log(error)
    })
  });
}

module.exports = writeToSource;
 

Заранее благодарю вас!

Ответ №1:

Я думаю, это потому, что вы не экспортировали функцию или что-то в своем WriteToSouce.js файл

  export function WriteToSource(...args){
   //do your stuff
}
 

ИЛИ вы могли бы использовать

  module.exports=WriteToSource;
 

Как говорится в документации для require

Основная функциональность require заключается в том, что он считывает файл JavaScript, выполняет файл, а затем переходит к возврату экспорта

В вашем случае вы никогда не экспортировали функцию, но называли ее последней как функцию в основном файле js, что означает const writeToSource = require('./writeToSource'); , что она ничего не возвращает, а writeToSource не определен

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

1. Спасибо за ответ! Я экспортировал его в свой файл, но забыл написать здесь. Прости!

Ответ №2:

writeSource действительно не является функцией, это возвращаемое значение writeToSource(…args). Если вы хотите, чтобы это была функция, попробуйте это

 const writeSource = () => { 
writeToSource("on.json", "On", title, dataInfo, text, imgUrl, sourceImgUrl, url);}
 

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

1. Теперь понял. Спасибо!

Ответ №3:

Я чувствую себя сейчас очень глупо. Я просто const writeSource = writeToSource() заменил функцию стрелкой — const writeSource = () => { writeToSource() }

и это работает.

Ответ №4:

Вы не экспортировали функцию writeToSource, чтобы она была доступна в main.js

module.exports = Источник записи;

Создал кодовое поле просто для того, чтобы уточнить, как вы будете его экспортировать https://codesandbox.io/s/currying-browser-5lzqy?file=/src/index.js

Издевался над вашими файлами и вызывал writeToSource из главного(index.js) работы

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

1. Спасибо за ответ! Я экспортировал его в свой файл, но забыл написать здесь. Прости!