与Knex.js同时使用req.body和SELECT语句

时间:2019-02-04 15:28:20

标签: node.js postgresql rest api knex.js

我正在使用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" }));
    });
};

我该如何解决?

2 个答案:

答案 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) 
       }