這是我第一次將 Web 應用程式部署到生產環境。我正在使用 Heroku,并通過 Udemy 學習了一個教程。如有必要,我可以提供本教程的 repo,但我認為這對我來說是 100%。
我現在所有的 API 呼叫都是到 localhost:8000/api/v1/xxxxxxxx,我在生產中看到了——這些呼叫沒有提取資料。我在控制臺中收到的錯誤訊息是:net::ERR_CONNECTION_REFUSED。當我與丈夫分享產品 URL 時,我注意到了這一點,他無法在筆記本電腦上查看任何后端資料。
使用 Safari、Chrome、Firefox 和 Brave 瀏覽器在我的筆記本電腦上一切正常——包括在隱身模式下——但它在任何其他機器上都不起作用——所以我知道我在這里做錯了。該站點使用 localhost 和 prod URL 為我作業。
我覺得自己像個菜鳥一樣問這個問題,但我應該更改 API URL 嗎?我覺得答案是肯定的,但是我在哪里放置我與 Heroku 一起使用的產品 URL?我的代碼中的任何地方都沒有 Heroku URL。
這是一個 MERN 應用程式,如果有幫助,我正在使用代理。它在我的 package.json 檔案中為“代理”:“http://localhost:8000”。
請隨時查看網站本身——網址是 r2bdb.herokuapp.com。您可以使用 [email protected] 登錄,密碼為password。如果確實為您加載,那么所有內容都是虛擬資料。
這是我的 server.js 檔案中的代碼。
import express from 'express';
const app = express();
import dotenv from 'dotenv';
dotenv.config();
import 'express-async-errors';
import morgan from 'morgan';
import cors from 'cors';
import nodemailer from 'nodemailer'
import { dirname } from 'path';
import { fileURLToPath } from 'url';
import path from 'path';
import helmet from 'helmet';
import xss from 'xss-clean';
import mongoSanitize from 'express-mongo-sanitize';
// db and authenticateUser (mongodb prisma)
import connectDB from './lib/connect.js';
import prisma from './lib/prisma.js';
// routers
import authRouter from './routes/authRoutes.js';
import sandboxRouter from './routes/sandboxRoutes.js';
import volunteerRouter from './routes/volunteerRoutes.js';
import eventRouter from './routes/eventRoutes.js';
import politicalRouter from './routes/politicalSkillsRoutes.js'
import lifeRouter from './routes/lifeSkillRoutes.js'
// middleware
import notFoundMiddleware from './middleware/not-found.js';
import errorHandlerMiddleware from './middleware/error-handler.js';
import authenticateUser from './middleware/auth.js';
if (process.env.NODE_ENV !== 'production') {
app.use(morgan('dev'));
}
const __dirname = dirname(fileURLToPath(import.meta.url));
// only when ready to deploy
app.use(express.static(path.resolve(__dirname, './client/build')));
app.use(express.json());
app.use(
helmet({
contentSecurityPolicy: false,
})
);
app.use(xss());
app.use(mongoSanitize());
app.use(cors());
app.use('/api/v1/auth', authRouter);
app.use('/api/v1/sandbox', sandboxRouter);
app.use('/api/v1/volunteer', volunteerRouter);
app.use('/api/v1/event', eventRouter);
app.use('/api/v1/political', politicalRouter)
app.use('/api/v1/life', lifeRouter)
// only when ready to deploy
app.get('*', (req, res) => {
res.sendFile(path.resolve(__dirname, './client/build', 'index.html'));
});
app.use(notFoundMiddleware);
app.use(errorHandlerMiddleware);
const port = process.env.PORT || 8000;
const start = async () => {
try {
await connectDB(process.env.MONGO_URL);
app.listen(port, () => {
console.log(`Server is listening on port ${port}...`);
});
} catch (error) {
console.log(error);
}
};
start();
正如我之前提到的,我的代碼中沒有任何生產 URL。我覺得這就是問題所在,但如果我是正確的,我不確定 URL 會去哪里。每個 API 呼叫都類似于:axios.get('http://localhost:8000/api/v1/xxxxxxxxxxx')。我的 .env 檔案將 PORT 列為 8000,因此我在任何有產品 URL 的地方都沒有環境變數。
為一個愚蠢的基本問題道歉 - 我從來沒有真正做到過這么遠,我自己將一個站點部署到生產中。如果我需要提供更多資訊,請告訴我——我不確定這里真正需要什么資訊并且不想超載,所以我只使用了我的 server.js 檔案。
uj5u.com熱心網友回復:
我剛剛發現了我的錯誤——我遺漏了 baseURL。如果其他人遇到此問題,我通過將其寫入我的代碼來修復它:
let baseURL = '';
if (process.env.NODE_ENV === 'development') {
baseURL = 'http://localhost:8000';
} else {
baseURL = 'https://r2bdb.herokuapp.com';
}
然后在我的 axios 呼叫中使用 baseURL '/api/v1/xxxxxxxx' 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/505015.html
標籤:javascript 节点.js 反应 表示 heroku
上一篇:為什么NodeJsreq.get('host')結果到數字海洋上的localhost:3000而不是我的實際域名
