Node-PostgreSQL 时间格式
Posted
技术标签:
【中文标题】Node-PostgreSQL 时间格式【英文标题】:Node-PostgreSQL time format 【发布时间】:2021-12-05 19:17:19 【问题描述】:我的 Postgres 数据库中有两个名为 users 和 card_info 的表。我已经创建了一个用于注册新用户的端点,并且我已经给出了一个名为 dateCreated 的字段,如下面的代码所示。
注册.js
const handleRegister=(req,res,db,bcrypt,saltRounds)=>
const name,phno,dob,email,username,password,aadharCard=req.body;
if(!name || !email|| !phno || !dob || !username || !password || !aadharCard)
return res.status(400).json('Wrong Form Submission');
const hash=bcrypt.hashSync(password,saltRounds);
const accNo=Math.floor(2E9+Math.random()*1E9);
const dateCreated=new Date().toJSON().slice(0,10);
db('users')
.insert(
username:username,
name:name,
email:email,
password:hash,
dob:dob,
phno:phno,
aadhar:aadharCard,
acc_no:accNo,
created_date:dateCreated
)
.returning('*')
.then(users=>
res.json(users[0]);
)
.catch(err=>res.status(400).json("Unable to register"));
module.exports=
handleRegister:handleRegister
在卡片端点中,我选择了用户创建的年份,其 id 作为请求发送。然后,我使用计算值将这些值存储到 card_info 表中。到期日期应该比 created_year 多 4 年。 users表的id是card_info表的外键
卡片.js
const genCard=(req,res,db)=>
const id,cardType =req.body;
db.select('created_date').from('users').where("id","=",id)
.then(data=>
const createdDate=data[0].created_date.toString();
db('card_info')
.insert(
card_number:Math.floor(Math.random()*1E17),
owner_id:id,
expiration_date: createdDate.replace(parseInt(createdDate),parseInt(createdDate)+4),
cvv:Math.floor(Math.random()*1E3),
card_type:cardType
)
.returning('*')
.then(users=>
console.log(res.json(users[0]));
)
.catch(err=>res.json(err.message))
)
.catch(err=>res.json(err));
module.exports=
genCard
这是我收到的错误:“插入“card_info”(“card_number”、“card_type”、“cvv”、“expiration_date”、“owner_id”)值($1、$2、$3、$4、$5)返回 * - 时区“gmt+0300”无法识别”。
我尝试了各种日期格式化方法,但似乎没有任何效果。如果有人对此有解决方案,请告诉我。
【问题讨论】:
Postgres 中expiration_date
设置的数据类型是什么?
@SamuelGoldenbaum 数据类型是日期不为空
我不知道createdDate.replace(parseInt(createdDate),parseInt(createdDate)+4)
应该实现什么。 data[0].created_date
是 Date
实例,对吗?所以通过 d.setUTCFullYear(d.getUTCFullYear() + 4)
修改它,而不是通过一些字符串恶作剧。
【参考方案1】:
我会避免所有试图操作表示日期的字符串的尝试——它只会导致眼泪,而且通常不会考虑边缘情况。而是直接操纵日期。我会推荐Luxon,它为Date
提供了一个久经考验的包装器,并且具有使处理日期更容易的便利功能。
// convert to DateTime object
const createdDate = DateTime.fromJSDate(data[0].created_date);
// add 3 months
const futureDate = createdDate.plus(months: 3);
// insert a date object
db('card_info').insert(
card_number:Math.floor(Math.random()*1E17),
...
created: futureDate, // or futureDate.toJSDate()
)
演示:
const
DateTime
= luxon;
// convert a saved date from the DB to DateTime
const dt = DateTime.fromJSDate(new Date());
// add 3 months
const futureDate = dt.plus(
months: 3
);
console.info(futureDate.toFormat('yyyy-MM-dd'), futureDate.toJSDate());
<script src="https://cdn.jsdelivr.net/npm/luxon@2.0.2/build/global/luxon.min.js"></script>
【讨论】:
我使用您建议的方法消除了该特定错误,但弹出了这个新错误:“insert into \"card_info\" (\"card_number\", \"card_type\", \" cvv\", \"expiration_date\", \"owner_id\") 值 ($1, $2, $3, $4, $5) 返回 * - 数值字段溢出" 顺便说一句,非常感谢,这个 luxon 包是我不知道的东西 好的,该错误是当您为字段创建的数据类型为数字并且值的大小大于列可以接受的长度/精度时。检查您的 card_number 和 cvv 列。它与日期无关。 我解决了这个错误,它与card_number有关。当我的字段约束只有 16 位时,我将其指定为 1E17。非常感谢,你刚刚救了我:) 很高兴听到 - 如果它解决了您的问题,请将答案标记为正确。祝项目的其余部分好运。以上是关于Node-PostgreSQL 时间格式的主要内容,如果未能解决你的问题,请参考以下文章