Javascript 如何在同一个express函数(mysql)中将项目添加到两个表中
我正在为虚拟商店创建购物车,当按下“提交”按钮时,我需要将订单插入“订单”表,并将项目插入“订单项目”表 我一直在使用express在每个函数中只在一个表中插入内容,但现在我需要将两者放在同一个表中。。。我试着用期票 这是我的html:Javascript 如何在同一个express函数(mysql)中将项目添加到两个表中,javascript,node.js,express,Javascript,Node.js,Express,我正在为虚拟商店创建购物车,当按下“提交”按钮时,我需要将订单插入“订单”表,并将项目插入“订单项目”表 我一直在使用express在每个函数中只在一个表中插入内容,但现在我需要将两者放在同一个表中。。。我试着用期票 这是我的html: 产品名称 价格 量 {{product.name} {{产品.价格|货币} 弗雷特:{票价|货币} 总计:{{Total | currency} 提交购物车 这是我调用的函数: registerTransaction(){ const
产品名称
价格
量
{{product.name}
{{产品.价格|货币}
弗雷特:{票价|货币}
总计:{{Total | currency}
提交购物车
这是我调用的函数:
registerTransaction(){
const date = new Date()
const dateTime = {
day: date.getUTCDate(),
month: date.getUTCMonth(),
year: date.getUTCFullYear(),
hour: date.getUTCHours() - 3,
minute: date.getUTCMinutes(),
sec: date.getUTCSeconds()
}
const transaction = {
date: new Date(`${dateTime.year}-${dateTime.month}-${dateTime.day}T${dateTime.hour}:${dateTime.minute}:${dateTime.sec}Z`)
}
transaction.userid = 1
transaction.fare = parseFloat(this.fare)
transaction.total = parseFloat(this.total)
transaction.cart = this.cart
axios.post(`${baseApiUrl}/checkout`, transaction)
.then(() => this.$toasted.global.defaultSuccess())
.catch(showError)
}
这是我的axios后端:
const save = (req, res) =>{
const transaction = {...req.body}
try{
existsOrError(transaction.date, "Error: transaction date is invalid")
existsOrError(transaction.userid, "Error in the user authentication")
//existsOrError(transaction.fare, "Error in calculating the fare")
existsOrError(transaction.total, "Error in the total value")
}
catch(msg){
return res.status(400).send(msg)
}
app.db('orders')
.insert(transaction)
.then(console.log('feito!'))
.then(saveProducts(transaction))
.catch(err => res.status(500).send(err))
}
const saveProducts = (transaction) => {
const orderId = app.db(`orders`).select(`idOrder`) .where({idClient: transaction.userid}).last()
console.log('Done')
for(let i = 0; i < transaction.cart.length; i++){
quantity = app.db('products').select('quantity').where({id: transaction.cart[i].id}).first()
quantity -= transaction.cart[i].quantity
app.db('products').update(quantity).where({id: transaction.cart[i].id})
const orderedProduct = {idOrder: parseInt(orderId), idProduct: parseInt(transaction.cart[i].id), quantity: parseInt(transaction.cart[i].quantity)}
app.db('orderedproducts').insert(orderedProduct).then(console.log('produto inserido')).catch(err => res.status(500).send(err))
}
return
}
const save=(请求、恢复)=>{
const事务={…req.body}
试一试{
ExistorError(transaction.date,“错误:交易日期无效”)
existsOrError(transaction.userid,“用户身份验证中的错误”)
//ExistorError(transaction.fare,“计算票价时出错”)
existsOrError(transaction.total,“总值中的错误”)
}
捕获(味精){
返回res.status(400).发送(msg)
}
app.db(“订单”)
.插入(交易)
.then(console.log('feito!'))
.然后(储蓄产品(交易))
.catch(err=>res.status(500).send(err))
}
const saveProducts=(事务)=>{
const orderId=app.db(`orders`)。选择(`idOrder`)。其中({idClient:transaction.userid})。last()
console.log('Done')
for(设i=0;ires.status(500)。send(err))
}
回来
}
我希望它先保存我的订单,调用saveProducts函数保存订单中的产品,然后返回,但它返回了一个错误,好像不允许这样做…我查看了文档,发现了以下内容,这基本上意味着查询方法有一个promise接口,这意味着我们可以附加
然后和catch方法。这也意味着我们可以对其使用async/await
knex.select('*')
.from('users')
.where({name: 'Tim'})
.then(function(rows) {
return knex.insert({user_id: rows[0].id, name: 'Test'}, 'id').into('accounts');
})
.then(function(id) {
console.log('Inserted Account ' + id);
})
.catch(function(error) { console.error(error); });
对于您的代码,我添加了async/await
,如果您愿意,可以使用然后方法
const save = (req, res) => {
const transaction = { ...req.body };
try {
existsOrError(transaction.date, "Error: transaction date is invalid");
existsOrError(transaction.userid, "Error in the user authentication");
//existsOrError(transaction.fare, "Error in calculating the fare")
existsOrError(transaction.total, "Error in the total value");
} catch (msg) {
return res.status(400).send(msg);
}
try {
let orderId = await app
.db("orders")
.insert(transaction);
console.log('order inserted :' + orderId);
await saveProducts(transaction);
console.log("saved all the products");
} catch(err) {
console.log(err);
}
};
const saveProducts = async transaction => {
const orderId = await app
.db(`orders`)
.select(`idOrder`)
.where({ idClient: transaction.userid })
.last();
console.log("orderId : " + orderId);
let quantity;
for (let i = 0; i < transaction.cart.length; i++) {
quantity = await app
.db("products")
.select("quantity")
.where({ id: transaction.cart[i].id })
.first();
quantity -= transaction.cart[i].quantity;
await app
.db("products")
.update(quantity)
.where({ id: transaction.cart[i].id });
const orderedProduct = {
idOrder: parseInt(orderId),
idProduct: parseInt(transaction.cart[i].id),
quantity: parseInt(transaction.cart[i].quantity)
};
let insertedId = await app
.db("orderedproducts")
.insert(orderedProduct)
.catch(err => res.status(500).send(err));
console.log("inserted ordered product");
}
return;
};
const save=(请求、恢复)=>{
const transaction={…req.body};
试一试{
ExistorError(transaction.date,“错误:交易日期无效”);
existsOrError(transaction.userid,“用户身份验证中的错误”);
//ExistorError(transaction.fare,“计算票价时出错”)
existsOrError(transaction.total,“总值中的错误”);
}捕获(味精){
返回res.status(400)。发送(msg);
}
试一试{
让orderId=等待应用程序
.db(“订单”)
.插入(交易);
log('插入的订单:'+订单ID);
等待保存产品(交易);
console.log(“保存了所有产品”);
}捕捉(错误){
控制台日志(err);
}
};
const saveProducts=异步事务=>{
const orderId=等待应用程序
.db(`orders`)
.select(`idOrder`)
.where({idClient:transaction.userid})
.last();
log(“orderId:+orderId”);
让数量;
for(设i=0;ires.status(500).send(err));
console.log(“插入的订购产品”);
}
回来
};
注意:我没有执行代码,所以我不能保证它会执行
按照你想要的方式工作,但我相信这会给你一个机会
如何前进的想法
错误是什么?它会遍历所有代码,不会更改数据库中的寄存器,并返回“[object]”作为错误消息我发现了其中一个问题!这是datetime格式,我刚刚更改:date:new date(${datetime.year}-${datetime.month}-${datetime.day}T${datetime.hour}:${datetime.minute}:${datetime.sec}Z)到:date:${datetime.year}-${datetime.datetime.date}${datetime.hour}:${datetime.minute,如果有人可以帮助…app.db(
orders)。选择(
idOrder)。其中({idClient:transaction.userid})。last()console.log('Done')
)是ORM方法还是什么?如果是,您使用的是哪种ORM,并且我认为如果是异步调用,那么您可能需要调用wait,或者如果您使用的是promise,那么它将必须添加然后回调。我没有使用ORM方法。。。我将尝试使用async await,并在此处发布结果:)