在Vercel上部署Express服务器时出现问题[找不到404页]

irlmq6kh  于 2022-10-21  发布在  iOS
关注(0)|答案(2)|浏览(155)

我尝试在Vercel上部署我的Express服务器,以解决我的前端代码上的CORS问题
问题是当我进入部署页面时弹出404错误
但当我试穿本地主机时,它运行得很好

// vercel.json       
{
      "version": 2,
      "builds": [
        {
          "src": "./index.js",
          "use": "@vercel/node"
        }
      ],
      "routes": [
        {
          "src": "/(.*)",
          "dest": "/"
        }
      ],
      "rewrites": [{ "source": "/api/(.*)", "destination": "/api" }]
    }

//index.js
const express = require("express");
const cors = require("cors");
const axios = require("axios");

const app = express();

const PORT = process.env.PORT || 3000;
require("dotenv").config();

let corsOptions = {
  origin: ["http://localhost:3000", "https://humanscape-team5a.netlify.app"],
};

app.use(cors(corsOptions));

app.get("/", (req, res) => {
  const textQuery = req.query.searchText;
  const numOfRowsQuery = req.query.numOfRows;

  axios
    .get(
      "http://apis.data.go.kr/B551182/diseaseInfoService/getDissNameCodeList",
      {
        params: {
          sickType: 1,
          medTp: 2,
          diseaseType: "SICK_NM",
          searchText: textQuery,
          ServiceKey: process.env.KEY,
          numOfRows: numOfRowsQuery,
          _type: "json",
        },
      }
    )
    .then(response => res.send(response.data));
});

app.listen(PORT, () => {
  console.log(`Server running on ${PORT}`);
});

当它在本地主机上工作时,我猜这是一种Vercel设置问题。有什么想法吗?

2hh7jdfx

2hh7jdfx1#

不确定您是否仍在寻找解决方案,但经过一些重要的尝试和错误后,我确实解决了这个问题。
首先,Vercel似乎需要一个包含index.js文件的/api文件夹才能工作。最初,我感到困惑,因为在本地工作时,我的index.js文件也用来启动我的服务器。Vercel基本上是在本地取代您的服务器文件。您仍然应该将它留到本地测试,但在使用Vercel时,您基本上可以忽略它。
在您的/api/index.js文件中,您将存放您的路线。

./api/index.js

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('../routes/index');

var app = express();

const whitelist = [
  '*'
];

app.use((req, res, next) => {
  const origin = req.get('referer');
  const isWhitelisted = whitelist.find((w) => origin && origin.includes(w));
  if (isWhitelisted) {
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,Content-Type,Authorization');
    res.setHeader('Access-Control-Allow-Credentials', true);
  }
  // Pass to next layer of middleware
  if (req.method === 'OPTIONS') res.sendStatus(200);
  else next();
});

const setContext = (req, res, next) => {
  if (!req.context) req.context = {};
  next();
};
app.use(setContext);

app.use('/', indexRouter);

module.exports = app;

我的vercel.json文件是...

// vercel.json

{
   "version": 2,
   "builds": [
    {
        "src": "./index.js",
        "use": "@vercel/node"
    }
   ],
   "routes": [
    {
        "src": "/(.*)",
        "dest": "/"
    }
   ]
}

不知道这是否有帮助,但这对我很管用。最重要的是将index.js路径文件嵌套在一个API文件夹中。

qgelzfjb

qgelzfjb2#

文档称node.js应用程序需要项目根目录中的api/文件夹。这意味着您的index.js必须在此文件夹中。**重要提示:**如果您的索引命名为app.js,则必须将其重命名为index.js
Link说:“要部署无服务器Node.js API,请在项目根目录的/api目录下的.js文件中创建一个函数:”

相关问题