#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 включен!