我正在使用Knex.js,express.js和body-parser设置Node.js API。
现在我想先插入一个
request.body (我正在通过邮递员atm进行此操作)
并立即使用选择语句再次插入,如下所示。
我已经连续尝试了2个knex.insert,但是它只返回第一个。 您认为我在执行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" }));
});
};
我该如何解决?
答案 0 :(得分:0)
如果您需要根据其他查询结果执行查询,则可以链接多个promise。
例如
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。您可以使用then & catch
来尝试使用async & await
,而不用使用{{1}},这样您的代码将更具可读性。
答案 1 :(得分:0)
我终于解决了它并创造了多个承诺。插入时,如代码
所示,我使用了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)
}