与 Knex.js 同时使用 req.body 和 SELECT 语句
Using req.body and a SELECT-statement simultaneously with Knex.js
我正在使用 Knex.js、express.js 和主体解析器设置 Node.js API。
现在我想做一个插入,首先使用
request.body(我用邮递员 atm 做这个)
并在二手手上使用 select-语句 将另一个插入 ,如下所示。
我已经连续尝试了 2 knex.insert,但它 returns 只是第一个。
你认为我应该在执行 createQuestionnaire 时只用一个单独的 ALTER TABLE 语句来解决它吗?
table questionnaire
id,
title, (insert using req.body)
description, (insert using req.body)
created_by_id (fk) (insert using select-statement)
exports.createQuestionnaire = function (req, res) {
// The Code I need to implement
// knex('users').where({
// id: req.session.passport.user
// }).select('id')
//this works fine
knex
.insert(req.body)
.returning('*')
.into('questionnaire')
.then(function (data) {
res.send(data);
})
.catch(function (err) {
console.error(err);
res.set({ 'content-type': 'application/json; charset=utf-8' });
res.end(JSON.stringify({ message: "Failed" }));
});
};
我该如何解决?
如果您需要根据其他查询结果执行查询,您可以链接多个承诺。
例如
exports.createQuestionnaire = function (req, res) {
knex('users').where({
id: req.session.passport.user
}).select('id').then(rows => {
if (!rows.length) {
throw 'user-not-found'
}
req.body['created_by_id'] = rows[0].id;
knex.insert(req.body) // Dangerous! You should check the required fields before inserting user input to db...
.returning('*')
.into('questionnaire')
.then(function (data) {
res.send(data);
})
.catch(function (err) {
console.error(err);
res.set({ 'content-type': 'application/json; charset=utf-8' });
res.end(JSON.stringify({ message: "Failed" }));
});
});
}
P.S。您可以尝试使用 async & await
而不是使用 then & catch
,您的代码将更具可读性。
我终于解决了它并创建了多个承诺。插入时,我使用了 ES6 解构,如代码
所示
let createdById = null;
exports.createQuestionnaire = function (req, res) {
//get id by user-login
knex('users').where({
id: req.session.passport.user
}).select('id')
//insert into questionnaire
.then(function (user) {
createdById = user[0].id;
knex
.insert({ ...req.body, created_by_id: createdById })
.returning('*')
.into('questionnaire')
.then(function (data) {
res.send(data)
}
我正在使用 Knex.js、express.js 和主体解析器设置 Node.js API。
现在我想做一个插入,首先使用
request.body(我用邮递员 atm 做这个)
并在二手手上使用 select-语句 将另一个插入 ,如下所示。
我已经连续尝试了 2 knex.insert,但它 returns 只是第一个。 你认为我应该在执行 createQuestionnaire 时只用一个单独的 ALTER TABLE 语句来解决它吗?
table questionnaire
id,
title, (insert using req.body)
description, (insert using req.body)
created_by_id (fk) (insert using select-statement)
exports.createQuestionnaire = function (req, res) {
// The Code I need to implement
// knex('users').where({
// id: req.session.passport.user
// }).select('id')
//this works fine
knex
.insert(req.body)
.returning('*')
.into('questionnaire')
.then(function (data) {
res.send(data);
})
.catch(function (err) {
console.error(err);
res.set({ 'content-type': 'application/json; charset=utf-8' });
res.end(JSON.stringify({ message: "Failed" }));
});
};
我该如何解决?
如果您需要根据其他查询结果执行查询,您可以链接多个承诺。
例如
exports.createQuestionnaire = function (req, res) {
knex('users').where({
id: req.session.passport.user
}).select('id').then(rows => {
if (!rows.length) {
throw 'user-not-found'
}
req.body['created_by_id'] = rows[0].id;
knex.insert(req.body) // Dangerous! You should check the required fields before inserting user input to db...
.returning('*')
.into('questionnaire')
.then(function (data) {
res.send(data);
})
.catch(function (err) {
console.error(err);
res.set({ 'content-type': 'application/json; charset=utf-8' });
res.end(JSON.stringify({ message: "Failed" }));
});
});
}
P.S。您可以尝试使用 async & await
而不是使用 then & catch
,您的代码将更具可读性。
我终于解决了它并创建了多个承诺。插入时,我使用了 ES6 解构,如代码
所示 let createdById = null;
exports.createQuestionnaire = function (req, res) {
//get id by user-login
knex('users').where({
id: req.session.passport.user
}).select('id')
//insert into questionnaire
.then(function (user) {
createdById = user[0].id;
knex
.insert({ ...req.body, created_by_id: createdById })
.returning('*')
.into('questionnaire')
.then(function (data) {
res.send(data)
}