Vercel部署Node.js Express接口Post方法失效,报stream不可读错误
Node.js API 在 Vercel Dev 环境下出现 "stream is not readable" 错误
运行vercel dev启动服务后,提交请求时抛出以下错误:
$ vercel dev Vercel CLI 34.2.7 > Ready! Available at http://localhost:3000 InternalServerError: stream is not readable at readStream (C:\Users\mypc\MyDrive\workspace\visualstudio\sample-vercel\node_modules\raw-body\index.js:178:17) at getRawBody (C:\Users\mypc\MyDrive\workspace\visualstudio\sample-vercel\node_modules\raw-body\index.js:109:12) at read (C:\Users\mypc\MyDrive\workspace\visualstudio\sample-vercel\node_modules\body-parser\lib\read.js:79:3) at jsonParser (C:\Users\mypc\MyDrive\workspace\visualstudio\sample-vercel\node_modules\body-parser\lib\types\json.js:135:5) at Layer.handle [as handle_request] (C:\Users\mypc\MyDrive\workspace\visualstudio\sample-vercel\node_modules\express\lib\router\layer.js:95:5) at trim_prefix (C:\Users\mypc\MyDrive\workspace\visualstudio\sample-vercel\node_modules\express\lib\router\index.js:328:13) at C:\Users\mypc\MyDrive\workspace\visualstudio\sample-vercel\node_modules\express\lib\router\index.js:286:9) at Function.process_params (C:\Users\mypc\MyDrive\workspace\visualstudio\sample-vercel\node_modules\express\lib\router\index.js:346:12) at next (C:\Users\mypc\MyDrive\workspace\visualstudio\sample-vercel\node_modules\express\lib\router\index.js:280:10) at expressInit (C:\Users\mypc\MyDrive\workspace\visualstudio\sample-vercel\node_modules\express\lib\middleware\init.js:40:5) at Layer.handle [as handle_request] (C:\Users\mypc\MyDrive\workspace\visualstudio\sample-vercel\node_modules\express\lib\router\layer.js:95:5) at trim_prefix (C:\Users\mypc\MyDrive\workspace\visualstudio\sample-vercel\node_modules\express\lib\router\index.js:328:13) at C:\Users\mypc\MyDrive\workspace\visualstudio\sample-vercel\node_modules\express\lib\router\index.js:286:9) at Function.process_params (C:\Users\mypc\MyDrive\workspace\visualstudio\sample-vercel\node_modules\express\lib\router\index.js:346:12) at next (C:\Users\mypc\MyDrive\workspace\visualstudio\sample-vercel\node_modules\express\lib\router\index.js:280:10) at query (C:\Users\mypc\MyDrive\workspace\visualstudio\sample-vercel\node_modules\express\lib\middleware\query.js:45:5)
当前项目代码:
index.js
const express = require('express'); const cron = require("node-cron"); const path = require('path'); const bodyParser = require('body-parser'); const PropertiesReader = require('properties-reader'); var environment = require(path.join(__dirname, '..', 'components', 'env', 'environment')); var properties = new PropertiesReader(environment); var routes = require('../components/controllers/routes'); var app = express(); app.use(bodyParser.json()); // support json encoded bodies app.use(bodyParser.urlencoded({ extended: true })); // support encoded bodies app.use('/public', express.static(path.join(__dirname, '../components/static'))); app.use('/sw.js', express.static(path.join(__dirname, '../components/static/sw.js'))); routes(app); const PORT = process.env.PORT || properties.get('main.app.port'); if (require.main === module) { app.listen(PORT, () => console.log('Server ready on port '+PORT)); } module.exports = app;
routes.js
module.exports = function (app) { app.use(session({ secret: 'secretsession', resave: true, saveUninitialized: true })); // set the view engine to ejss app.set('view engine', 'ejs'); app.get('/', function (req, res) { res.sendFile(path.join(__dirname + '/../static/index.html')); }); app.post('/send', function (req, res) { console.log("Request Received"); }); }
观察到请求并未到达/send路由的POST处理函数,浏览器和Postman提交请求均触发相同错误。
解决方案
1. 替换body-parser为Express内置解析器
Express 4.16.0及以上版本已集成body-parser核心功能,无需单独安装使用body-parser模块,旧版本的body-parser可能与Vercel Dev环境的请求流处理逻辑不兼容。修改index.js中的解析器配置:
// 移除 const bodyParser = require('body-parser'); // 替换原bodyParser相关代码为: app.use(express.json()); app.use(express.urlencoded({ extended: true }));
2. 修复routes.js中的依赖缺失
routes.js中使用了session和path模块但未引入,会导致运行时错误,需补充依赖:
// 在routes.js顶部添加 const session = require('express-session'); const path = require('path');
同时确保已安装express-session:
npm install express-session
3. 添加Vercel配置文件
在项目根目录创建vercel.json,指定Node.js运行环境和路由规则,确保Vercel能正确识别Express应用:
{ "version": 2, "builds": [ { "src": "./index.js", "use": "@vercel/node" } ], "routes": [ { "src": "/(.*)", "dest": "/index.js" } ] }
4. 重启Vercel Dev服务
修改完成后,停止当前vercel dev进程,重新启动服务测试请求。
内容的提问来源于stack exchange,提问作者Pathfinder
相关产品推荐
相关产品推荐

