我目前正在尝试在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提供此类应用?
答案 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”是您的服务器的入口点,请确保在那里写入正确的文件名。
希望我能帮助您部署您的应用。
干杯!