繁体   English   中英

Node.js 中的 ECMAscript 导出

[英]ECMAscript export in Node.js

我在 nodejs 中创建了一个 NFL 足球模拟器,并且无法导出我的一个变量。 正如您在我的 get_teams.js 中看到的,我提出了许多 HTTP 请求。 然后我处理 responseArr 并格式化数据。 当我尝试导出 sorted_teams_array 时,我遇到了问题。 您可以在 get_teams.js 的最底部找到此代码。

然后我尝试将此数组导入 tester.js 并控制台记录它。 我最终将使用这个文件来注入一个带有数组的 mongo 数据库,但现在我只是试图控制台记录它并且无法让它工作。 当我运行 npm 运行测试仪时,我在我的 npm 脚本中使用了 --experimental-modules,但仍然没有。 任何帮助都会很棒! 我是个菜鸟,所以请不要讨厌!

get_teams.js

import axios from 'axios';
import Nfl_team from '../models/teamModel.js';
import Offensive_stats from '../models/offensiveStatsModel.js';
import Defensive_stats from '../models/defensiveStatsModel.js';
import Game_stats from '../models/gameStatsModel.js';
import colors from 'colors';
import dotenv from 'dotenv';
dotenv.config();

const teams = {};



function get_teams() {
  axios.all([
    axios.get(`https://api.sportsdata.io/api/nfl/fantasy/json/Standings/${process.env.SEASON}?key=${process.env.API_KEY}`),

    // ... many more gets

  ])
  .then(function (responseArr) {
      
    responseArr[0].data.forEach(element => {
        teams[element.Team] = new Nfl_team(element.Team, element.Name, element.Wins, element.Losses, element.Ties,
          element.Percentage, element.DivisionWins, element.DivisionLosses, element.DivisionTies,
          element.PointsFor, element.PointsAgainst)
    });

    // many more forEach blocks on responseArr[1, 2, 3...]
    
    /* power rating algorithm logic
    _____________________________________________ */
    
   const teams_array = Object.entries(teams);

   export const sorted_teams_array = teams_array.sort((a, b) => {
      if (a[1].average_victory_margin > b[1].average_victory_margin) return -1;
      if (a[1].average_victory_margin < b[1].average_victory_margin) return 1;
      return 0;
    })

    console.log(sorted_teams_array);

    teams_array.forEach(element => {
      console.log(`average victory margin for ${element[0]} = ${element[1].average_victory_margin}`)
    });  

  })
  .catch(function (error) {
    // handle error
    console.log(error);
  })
}


get_teams();

tester.js

import { sorted_teams_array } from './get_teams';

console.log(sorted_teams_array);


/// returns
(node:58769) ExperimentalWarning: The ESM module loader is experimental.
internal/modules/esm/resolve.js:61
  let url = moduleWrapResolve(specifier, parentURL);
            ^

Error: Cannot find module /Users/jojovera/Documents/nflSIMULATION/teams/get_teams imported from /Users/jojovera/Documents/nflSIMULATION/teams/tester.js
    at Loader.defaultResolve [as _resolve] (internal/modules/esm/resolve.js:61:13)
    at Loader.resolve (internal/modules/esm/loader.js:94:40)
    at Loader.getModuleJob (internal/modules/esm/loader.js:240:28)
    at ModuleWrap.<anonymous> (internal/modules/esm/module_job.js:42:40)
    at link (internal/modules/esm/module_job.js:41:36) {
  code: 'ERR_MODULE_NOT_FOUND'
}

package.json

{
  "name": "optionsscript",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "type": "module",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node --experimental-modules app.js",
    "afc_west": "node --experimental-modules ../nflSIMULATION/teams/afc_west.js",
    "get_teams": "node --experimental-modules ../nflSIMULATION/teams/get_teams.js",
    "tester": "node --experimental-modules ../nflSIMULATION/teams/tester.js",
    "get_offensive_stats": "node --experimental-modules ../nflSIMULATION/teams/get_offensive_stats.js",
    "get_defensive_stats": "node --experimental-modules ../nflSIMULATION/teams/get_defensive_stats.js",
    "get_victory_margin": "node --experimental-modules ../nflSIMULATION/teams/get_victory_margin.js",
    "power_rank": "node --experimental-modules ../nflSIMULATION/teams/power_rank.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "axios": "^0.21.0",
    "cheerio": "^1.0.0-rc.5",
    "colors": "^1.4.0",
    "dotenv": "^8.2.0",
    "express": "^4.17.1",
    "jsonwebtoken": "^8.5.1",
    "nodemon": "^2.0.6",
    "stats-lite": "^2.2.0",
    "terminal-kit": "^1.44.0",
    "tofixed": "^1.0.0"
  }
}

如评论和聊天中所述,存在两个问题:节点 12 不支持 ESM,因此对 15 的更新修复了该问题。 另一个问题是 get_teams 没有有效导出任何内容:import 和 export 是顶级关键字,并且导出发生在 a.then 中。 这些微小的更改允许导入 function 并将其结果用于测试:

export function get_teams() {
  return axios.all([
    /// rest of code

      return sorted_teams_array;
    })
    .catch(function (error) {
      // handle error
      console.log(error);
    })
}

使用示例:

import { get_teams } from './get_teams'

get_teams.then((teams) => {
  teams.forEach(console.log)
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM