Развертывание API Nodejs в Heroku

#javascript #node.js #api #heroku #deployment

Вопрос:

Я как будто на 2 дня застрял в попытке развернуть этот API Nodejs на Heroku (и ирония/шутка: он работает на моей машине! Поверь мне! ЛОЛ). У меня было много и много ошибок раньше, но я, по-видимому, исправил их все, кроме этой сейчас:

 2021-08-12T02:33:53.000000 00:00 app[api]: Build started by user xxxx@hotmail.com
2021-08-12T02:34:31.000000 00:00 app[api]: Build succeeded
2021-08-12T02:34:31.051122 00:00 app[api]: Deploy 51176bf9 by user xxxxx@hotmail.com
2021-08-12T02:34:31.051122 00:00 app[api]: Release v38 created by user xxxxxx@hotmail.com
2021-08-12T02:34:32.043979 00:00 heroku[web.1]: State changed from crashed to starting
2021-08-12T02:34:36.299607 00:00 heroku[web.1]: Starting process with command `npm start`
2021-08-12T02:34:40.689105 00:00 app[web.1]:
2021-08-12T02:34:40.689147 00:00 app[web.1]: > backend@1.0.0 start /app
2021-08-12T02:34:40.689147 00:00 app[web.1]: > node ./dist/index.js
2021-08-12T02:34:40.689148 00:00 app[web.1]:
2021-08-12T02:34:40.925689 00:00 app[web.1]: file:///app/dist/index.js:5
2021-08-12T02:34:40.925709 00:00 app[web.1]: Object.defineProperty(exports, "__esModule", { value: true });
2021-08-12T02:34:40.925710 00:00 app[web.1]: ^
2021-08-12T02:34:40.925711 00:00 app[web.1]:
2021-08-12T02:34:40.925711 00:00 app[web.1]: ReferenceError: exports is not defined in ES module scope
2021-08-12T02:34:40.925717 00:00 app[web.1]: This file is being treated as an ES module because it has a '.js' file extension and '/app/package.json' contains "type": "module". To treat it as a CommonJS script, rename it to use the '.cjs' file extension.
2021-08-12T02:34:40.925721 00:00 app[web.1]: at file:///app/dist/index.js:5:23
2021-08-12T02:34:40.925726 00:00 app[web.1]: at ModuleJob.run (internal/modules/esm/module_job.js:170:25)
2021-08-12T02:34:40.925727 00:00 app[web.1]: at async Loader.import (internal/modules/esm/loader.js:178:24)
2021-08-12T02:34:40.925727 00:00 app[web.1]: at async Object.loadESM (internal/process/esm_loader.js:68:5)
2021-08-12T02:34:40.978104 00:00 app[web.1]: npm ERR! code ELIFECYCLE
2021-08-12T02:34:40.983071 00:00 app[web.1]: npm ERR! errno 1
2021-08-12T02:34:40.992651 00:00 app[web.1]: npm ERR! backend@1.0.0 start: `node ./dist/index.js`
2021-08-12T02:34:40.992928 00:00 app[web.1]: npm ERR! Exit status 1
2021-08-12T02:34:40.993242 00:00 app[web.1]: npm ERR!
2021-08-12T02:34:40.993515 00:00 app[web.1]: npm ERR! Failed at the backend@1.0.0 start script.
2021-08-12T02:34:40.993715 00:00 app[web.1]: npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
2021-08-12T02:34:41.004082 00:00 app[web.1]:
2021-08-12T02:34:41.004085 00:00 app[web.1]: npm ERR! A complete log of this run can be found in:
2021-08-12T02:34:41.004086 00:00 app[web.1]: npm ERR!     /app/.npm/_logs/2021-08-12T02_34_40_994Z-debug.log
2021-08-12T02:34:41.074430 00:00 heroku[web.1]: Process exited with status 1
2021-08-12T02:34:41.154351 00:00 heroku[web.1]: State changed from starting to crashed
 

Я перепробовал много вещей, но, насколько я знаю, я не могу использовать это предлагаемое решение, потому что я использую Typescript и использую «импорт ( … )», поэтому мне нужно сохранить "type": "module" и "module": "commonjs" то, и другое …

Вот мой текущий пакет.json:

 {
  "name": "backend",
  "version": "1.0.0",
  "description": "",
  "main": "./src/server.ts",
  "type": "module",
  "scripts": {
    "build": "rimraf dist amp;amp; tsc",
    "dev": "ts-node-dev --respawn --pretty --transpile-only ./src/index.ts",
    "start": "node ./dist/index.js"
  },
  "engines": {
    "node": "14.x",
    "npm": "6.x"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@types/body-parser": "^1.19.1",
    "@types/cors": "^2.8.12",
    "@types/express": "^4.17.13",
    "cors": "^2.8.5",
    "express": "^4.17.1",
    "helmet": "^4.6.0",
    "rimraf": "^3.0.2",
    "save": "^2.4.0",
    "ts-node": "^10.1.0",
    "ts-node-dev": "^1.1.8"
  },
  "devDependencies": {
    "@types/dotenv": "^8.2.0",
    "@types/helmet": "^4.0.0",
    "@types/node": "^16.4.13",
    "@typescript-eslint/eslint-plugin": "^3.9.1",
    "@typescript-eslint/parser": "^3.8.0",
    "dotenv": "^10.0.0",
    "typescript": "^4.3.5"
  }
}
 

И это мой текущий tsconfig.json:

 {
  "compilerOptions": {                        /* Enable incremental compilation */
    "target": "ESNEXT",                                /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', 'ES2021', or 'ESNEXT'. */
    "module": "commonjs",                           /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
    "outDir": "dist",                              /* Redirect output structure to the directory. */
    "strict": true,                                 /* Enable all strict type-checking options. */
    "esModuleInterop": true,                        /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
    "skipLibCheck": true,                           /* Skip type checking of declaration files. */
    "forceConsistentCasingInFileNames": true        /* Disallow inconsistently-cased references to the same file. */
  }
}
 

Это мое первое развертывание в Heroku, но я много читал из официальных документов, например, и, похоже, ничего не работает…

Я использую Github, подключенный к Heroku, и эта интеграция, похоже, работает нормально.

О, и вот мой индекс.ts:

 import dotenv from "dotenv";
import cors from "cors";
import helmet from 'helmet';
import express from "express";
import portfolioRouter from "./routes/portfolio-routes";
import teamRouter from "./routes/team-routes";

dotenv.config();
let PORT = parseInt(process.env.PORT as string, 10);
console.log("PORT: ", PORT);

const app = express();

app.use(cors());
app.use(helmet());
app.use(express.json())
app.use(express.urlencoded({ extended: true}))
app.use(express.json());

app.use("/api/v1/portfolio", portfolioRouter);
app.use("/api/v1/team", teamRouter);

console.log("PORT being used: ", PORT);

app.listen(PORT || 8080, () => {
    console.log(`Listening on port ${PORT}`);
});
 

Кто-нибудь?
Спасибо!

Ответ №1:

Попробуйте установить "module":"commonjs" значение "module":"es6"

Ответ №2:

[РЕШЕНО]

Я создал новый действительно простой API узла, используя только server.ts с приложением.get route, возвращающим строку. Но на этот раз я не включил развертывание на github. Я просто использовал мерзавца Хероку. После того, как все заработало нормально, я начал переносить свой предыдущий код в этот новый проект, и с этого времени все стало работать просто отлично.

Мой API включен!