node.js - NextJS - 从 getInitialProps 向 API 服务器发送 cookie
问题描述
我使用 NextJS 作为客户端存储库来与我的后端 API 服务器(laravel)通信。身份验证是通过存储在 cookie 中的 JWT 完成的。当我向 发送身份验证请求时,这一切都可以无缝运行https://my-backend-server.com/api/login
,因为我使用 cookie 进行响应,并设置为 my-backend-server.com 域。甚至当我从浏览器发送请求时。
当我想加载页面并从 getInitialProps 发送请求时出现问题,因为这是一个服务器端调用。我如何能够访问 cookiemy-backend-server.com
并将它们放在标题中,以便 NextJS 的服务器端请求得到正确授权?
大多数答案都说req.cookies
or req.headers.cookies
,但是这是空的,因为 getInitialProps 中的请求是http://my-local-clientside-site.com
解决方案
正如您正确解释的那样, Next是在client & on servergetInitialProps
上调用的。
如果您的 Next app 和 Api 服务是从同一个域提供的,您的 Api 服务可以将 cookie 放在域上,它将在客户端(浏览器)上运行。
每当您的 Next 应用程序从服务器端访问 api 时,您需要自己附加 cookie。
getInitialProps
服务器端的方法获取上下文(第一个参数)req
来自浏览器的请求(as),这意味着该请求具有cookie。
如果你有一个自定义服务器,你可能需要添加一个cookieParser,
// server.js
import cookieParser from 'cookie-parser';
import express from 'express';
import next from 'next';
const dev = process.env.NODE_ENV !== 'production';
const app = next({ dev });
app.prepare().then(() => {
const nextHandler = app.getRequestHandler();
const server = express();
server.use(cookieParser());
// -----------^
server.get('*', (req, res) => nextHandler(req, res));
});
此解析器将解析Cookie
标头并将其作为对象放在req
.
之后,你req.cookie
应该有 cookie 值(确保你看到浏览器在文档请求中发送它)你可以在你的getInitialProps
,
//pages/index.js
const IndexPage = () => <div>BLA</div>
IndexPage.getInitialProps = (context) => {
if(context.req) {
// it runs on server side
axios.defaults.headers.get.Cookie = context.req.headers.cookie;
}
};
我已经给你一个例子,它设置 axios 将 cookie 放在客户端发出的所有请求上。
推荐阅读
- git - 如何组织本地 Git 存储库
- database - 如何在列上创建约束,以便在列中输入值?
- android - Android:绘制贝塞尔曲线形状
- asp.net - 当从磁盘加载 HTML 时,使根相对 URL 也可以工作
- azure - Application Insights 能否与运行 .NET Core 3 运行时的 Linux Web 应用一起使用?
- sorting - 对列进行排序时移动整行(Google Apps 脚本)
- python - Networkx 没有从邻接矩阵返回一个漂亮的图
- powershell - Powershell 启动进程参数列表未正确处理冒号
- postgresql - 将超过 5000 万从 Pyspark df 写入 PostgresSQL,最有效的方法
- django - 如何通过超模的属性过滤模型对象?