我的React / NextJS前端有一个Button组件,当单击按钮时,该组件通过无服务器功能获取数据。我想在使用Vercel dev / CLI工具进行本地开发期间测试此功能。尝试访问lambda函数时收到404结果。这是到目前为止我已经完成的大致步骤:
package.json
:...
"scripts": {
"dev": "yarn codegen && next --hostname=0.0.0.0 --port=3001",
}
...
vercel.json
以指定构建和路线:...
"builds": [
{ "src": "*.html", "use": "@now/static" },
{ "src": "pages/api/*.py", "use": "@now/python" },
],
"routes": [
{ "src": "/api/validate", "dest": "/pages/api/validate.py" }
]
...
from http.server import BaseHTTPRequestHandler
from datetime import datetime
class handler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-type', 'text/plain')
self.end_headers()
self.wfile.write(str(datetime.now().strftime('%Y-%m-%d %H:%M:%S')).encode())
return
...
<Button
variant="contained"
color="secondary"
onClick={() => {
fetch('api/validate')
.then(response => { console.log(response)
response.json() })
.then(data => console.log(data))
}}
>
Generate sample dataset
</Button>
...
vercel dev
localhost:3001
(下一个开发服务器地址)上的网站结果:
我收到404
的回复
注意:我可以从localhost:3000/pages/api/validate.py
(verdev开发服务器地址)访问lambda函数。这似乎是手动启动lambda函数的构建和服务过程。我认为它应该已经根据vercel.json
规范进行了构建和使用,并且可以在localhost:3001/api/validate
上使用。这似乎与Vercel documentation一致。
注意2:接下来的dev / CLI工具可以很好地构建和提供javascript / typescript文件。我也在使用python和Go函数,Vercel dev / CLI支持这些函数,但Next不支持
答案 0 :(得分:0)
您需要将端口从vercel dev
传递到上游CLI,在这种情况下为next dev
。
{
"scripts": {
"dev": "yarn codegen && next dev --port=$PORT",
}
}
现在,当您运行vercel dev
时,临时端口将由开发服务器代理。
如果将vercel.json
重命名为/pages/api
,也可以删除/api
。
答案 1 :(得分:0)
我的解决方案是使用vercel dev
而不是next dev
或yarn dev
,并在指向功能URL的.env
文件中使用环境变量。此env变量应以NEXT_PUBLIC_
开头,以便在构建过程中由next.js注册并传递给process.env
。
# .env
NEXT_PUBLIC_FUNCTIONS_BASE_URL="http://localhost:3000" # 3000 is vercel port
# component.js
...
fetch(process.env.NEXT_PUBLIC_FUNCTIONS_BASE_URL + '/api/function-name')
...