node.js - res.cookie 未在某些帐户的浏览器中设置 cookie
问题描述
嘿伙计们,所以我将以下请求作为文本发送到我的发布路线:{ JSON: '{"company":"OmarCompanyTestDev_1","token":"3c87d2345c637627d4c45a39de0362444001b222","email":"support47@support.com","devices":[{"width":200,"height":200}],"first_name":"support user","last_name":"for OmarCompanyTestDev_1"}' }
这个请求有时只有效,但我的所有变量都被分配,并且它应该重定向。
但是,此请求每次都有效。
{ JSON: '{"company":"NewCompany2","token":"8674f778db4d1e58d5f1fedea4e5fa90ceffc9c2","email":"support69@support.com","devices":[],"first_name":"support user","last_name":"for NewCompany2"}' }
这是我在nodejs中运行的代码。我似乎没有收到任何错误,cookie 只是没有在第一个请求上设置。我不明白两者之间有什么不同。所有变量都分配并且所有日志都有效,但未设置 cookie。
router.post("/banner-login", async (req, res, next) => {
function insertDisplay(displayName, userId, width, height) {
database.query("call insertDisplay(?, ?, ?, ?)", [
displayName,
userId,
width,
height
]);
}
try {
console.log("request body", req.body);
const bannerJson = JSON.parse(req.body.JSON);
const {
company,
email,
token,
devices,
first_name,
last_name
} = bannerJson;
console.log("bannerJSON", bannerJson);
console.log("company", company);
console.log("email", email);
console.log("token", token);
console.log("devices", devices);
console.log("first_name", first_name);
console.log("last_name", last_name);
const username = company.replace(/ /g, "_");
console.log("username", username);
const password = process.env.BANNER_USER_PASSWORD;
const userIdResult = await database.query("call getUserIdByUsername(?)", [
username
]);
const exists = userIdResult[0][0];
if (exists) {
const userId = userIdResult[0][0].id;
await database.query(
"update users set banner_token=" +
database.escape(token) +
" where id=" +
database.escape(userId)
);
await database.query("call deleteDisplaysByUserId(?)", [userId]);
devices.forEach(item => {
let displayName = item.width.toString() + "x" + item.height.toString();
insertDisplay(displayName, userId, item.width, item.height);
});
} else {
const userAttributes = [
{
Name: "given_name",
Value: first_name
},
{
Name: "family_name",
Value: last_name
},
{
Name: "email",
Value: email
},
{
Name: "phone_number",
Value: "+1234567890"
},
{
Name: "custom:company",
Value: company
},
{
Name: "custom:role",
Value: "banner"
}
];
await cognito
.signUp({
ClientId: process.env.AWS_COGNITO_CLIENT_ID,
Username: username,
Password: password,
UserAttributes: userAttributes
})
.promise();
const params = {
UserAttributes: [{ Name: "email_verified", Value: "true" }],
UserPoolId: process.env.AWS_COGNITO_USER_POOL_ID,
Username: username
};
await cognito.adminUpdateUserAttributes(params).promise();
const confirmParams = {
UserPoolId: process.env.AWS_COGNITO_USER_POOL_ID,
Username: username
};
await cognito.adminConfirmSignUp(confirmParams).promise();
const plan = "FREE";
const dbPlanName = plan !== "FREE" ? "Braintree" : plan;
const isDisplayOwner = 1;
const [[{ insertId }]] = await database.query(
"CALL insertUser (?, ?, ?, ?)",
[username, dbPlanName, isDisplayOwner, token]
);
const paramsId = {
UserAttributes: [
{
Name: "custom:CE_user_id",
Value: insertId.toString()
}
],
UserPoolId: process.env.AWS_COGNITO_USER_POOL_ID,
Username: username
};
await cognito.adminUpdateUserAttributes(paramsId).promise();
// login
const userId = insertId;
await database.query(
"update users set banner_token=" +
database.escape(token) +
" where id=" +
database.escape(userId)
);
await database.query("call deleteDisplaysByUserId(?)", [userId]);
devices.forEach(item => {
let displayName = item.width.toString() + "x" + item.height.toString();
insertDisplay(displayName, userId, item.width, item.height);
});
}
const data = await cognito
.initiateAuth({
AuthFlow: "USER_PASSWORD_AUTH",
ClientId: process.env.AWS_COGNITO_CLIENT_ID,
AuthParameters: {
USERNAME: username,
PASSWORD: password
}
})
.promise();
const { IdToken, AccessToken, RefreshToken } = data.AuthenticationResult;
const encryptedIdToken = crypto.encryptTokenPayload(IdToken);
const encryptedAccessToken = crypto.encryptTokenPayload(AccessToken);
res.cookie("token", {
IdToken: encryptedIdToken,
AccessToken: encryptedAccessToken,
RefreshToken: RefreshToken
});
res.redirect("/");
} catch (error) {
console.log("there was an error", error);
next(error);
}
});
这里的任何帮助都会很棒。谢谢
解决方案
基本上发生的事情是 cookie 的大小对于某些情况来说太大了。Cookies 只能容纳 4096 字节。在某些情况下,我的 cookie 数据比这大得多,cookie 不会设置。为了解决这个问题,我将 cookie 信息拆分为多个 cookie。希望这对其他人有帮助。
推荐阅读
- php - 使用命名空间(PHP)从另一个类调用方法
- java - 在其他语言中状态为 200 时,在 Java 中登录后重定向 302
- php - 可以在类中获取数据但返回时只发送布尔值php PDO?
- c# - HtmlAgilityPack NullReferenceException 错误
- python - PySpark:连接数据类型为“Struc”的两列-> 错误:由于数据类型不匹配而无法解决
- java - 使按钮适应 JavaFX 中的窗口大小调整(重新定位)
- blob - 在复制活动期间或在 blob 数据集中指定名称时将日期时间动态附加到文件名
- php - 为什么我在我的本地主机上得到未定义的变量或索引,而不是我的实时服务器?
- sql - 比较 Oracle 中的 2 个列表
- python - 如何修复标签数量与样本数量不匹配?