与 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) 
       }