在Vercel上部署Expressjs + Nextjs应用程序

时间:2020-09-04 12:17:40

标签: node.js express next.js vercel

我目前正在尝试在vercel上部署我的express + nextjs应用程序。它们是这样链接的:

const express = require('express');
const dotenv = require('dotenv');
const cors = require('cors');
const morgan = require('morgan');
const bodyparser = require('body-parser');
const compression = require('compression');
const path = require('path');
const http = require('http');
const io = require('socket.io');
const Next = require('next');
const favicon = require('express-favicon');
const connectDB = require('./services/mongo');
const SettingsStream = require('./listeners/settings');
const blogRouter = require('./api/blog');
const settingsRouter = require('./api/settings');

const dev = process.env.NODE_ENV !== 'production';

const fw = Next({ dev });
const handle = fw.getRequestHandler();

fw.prepare()
  .then(() => {
    const app = express();
    app.use(favicon(path.join(__dirname, '../', 'public/favicon.ico')));

    const server = http.createServer(app);

    const sio = io.listen(server);

    const PORT = parseInt(process.env.PORT, 10) || 5000;

    sio.on('connection', (client) => {
      SettingsStream(client);
    });
    //
    const shouldCompress = (req, res) => {
      if (req.headers['x-no-compression']) {
        return false;
      }

      return compression.filter(req, res);
    };
    //
    dotenv.config();
    //
    connectDB();
    //
    app.use(compression({ shouldCompress }));
    app.use(express.static(path.join(__dirname, 'public')));

    app.use(cors());
    //
    app.use(bodyparser.urlencoded({ extended: false }));
    app.use(bodyparser.json({ limit: '50mb' }));
    //
    // // Use routes
    app.use('/api/blog', blogRouter);
    app.use('/api/settings', settingsRouter);
    //
    if (dev) {
      app.use(morgan('dev'));
    }
    app.get('*', (req, res) => {
      return handle(req, res);
    });

    server.listen(PORT, (err) => {
      if (err) throw err;
      console.log(`App is runnign in port ${PORT}`);
    });
  })

  .catch(() => process.exit(1));

然后在我的package.json中,有一个脚本将其提供给Vercel:

"vercel-build": " next build && NODE_ENV=production node src/index.js",

Vercel运行第一部分并构建下一个应用程序,但是当第二部分运行时,它陷入了循环。您如何正确地向Vercel提供此类应用?

4 个答案:

答案 0 :(得分:0)

我希望这可以解决您的问题。创建一个now.json / vercel.json

{
"version": 2,
"name": "App name",
"builds": [
    {
        "src": "api/**/*.js",
        "use": "@now/node",
        "config": {
            "maxLambdaSize": "50mb"
        }
    },
    {
        "src": "package.json",
        "use": "@now/next"
    }
  ]
}

据我所知,节点应用程序建议放置在api文件夹中。 {@ {3}}是一个不支持Socket的平台。我在这个平台上是个新手,请分享您的发现。谢谢。

答案 1 :(得分:0)

vercel v2 api仅支持无服务器功能,请查看此sample code

答案 2 :(得分:0)

要么使用 vercel 无服务器 functions 方法,要么使用旧方式进行设置,使用 vercel.json 如下:

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

您需要确保将所有依赖项(例如 node_modules)上传到 vercel

答案 3 :(得分:0)

要在 Vercel 上部署 node.js,您需要先安装“now”。所以,这里是步骤:

1- 运行 npm install now@latest 来安装 CLI 2- 在项目的根目录上创建一个“now.json”文档 3- 复制并粘贴铃铛

now.json 文件示例:

{
  "version": 2,
  "builds": [{
    "src": "./server.js",
    "use": "@now/node-server"
  }],
  "routes": [{"handle": "filesystem"},
    {
      "src": "/.*",
      "dest": "server.js"
    }
  ]
}

“server.js”是您的服务器的入口点,请确保在那里写入正确的文件名。

  • 如果由于服务器端口正在使用而仍然下降,您需要将服务器端口更改为 80。

希望我能帮助您部署您的应用。

干杯!