Как выполнить несколько запросов и вернуть совокупный ответ, используя узел / экспресс / sqllite - PullRequest
0 голосов
/ 01 апреля 2020

Я довольно новичок в узле и его семействе, извините за техническую ошибку, которую я допускаю при объяснении.

Я пишу вызов API, используя узел, который должен подключиться к базе данных sqllite и выполнить два запроса обновление и вставка.

Я хочу понять, как выполнить несколько запросов в одном API, захватить выходные данные для обоих и вернуть их в окончательном ответе

app.get("/processing/updateandcreate/query/:ProcessID", (req, res, next) => {

var resultFinal;

db.run( `UPDATE PROCESS set CurrentStatus  = 'Query' where ProcessID=5`, {}, function (err,rows){
    if (err){
                res.status(400).json({"error": err.message})
                return;
            }
    resultFinal = resultFinal + rows;
});

db.run(`INSERT INTO QUERY RecordID values('1')`, {}, function (err, res2) {
            if (err){
                res.status(400).json({"error": err.message})
                return;
            }
            resultFinal = resultFinal + rows;
    });

        //I want to pass the result of both the queries here
res.json({
        message:"Okay"
    })   
 });

Эти команды сделали выполняется при тестировании API, но выдает эту ошибку:

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

Я думаю, что это, вероятно, происходит, когда мы пытаемся отправить несколько ответов.

Пожалуйста, помогите отсортировать это.

(я пишу get Call, в идеале этого не должно быть, но из-за некоторых проблем с конфигурацией мы можем выполнять только вызовы get для нашего приложения)

1 Ответ

1 голос
/ 01 апреля 2020

Вам необходимо использовать асинхронную c библиотеку обратного вызова, такую ​​как async, чтобы организовать несколько асинхронных c действий или использовать собственные обещания для того же эффекта. В эти дни я предпочитаю родные обещания. Node.js поставляется с служебным методом promisify, который преобразует обратные вызовы в обещания. С его помощью ваш код становится:

const { promisify } = require('util')
const runAsync = promsifiy(db.run.bind(db))
app.get("/processing/updateandcreate/query/:ProcessID", async (req, res, next) => {

  // resultFinal is row[][]
  try {

    const [updateList, insertList] = await Promise.all([
      runAsync(`UPDATE PROCESS set CurrentStatus  = 'Query' where ProcessID=5`, {}),
      runAsync(`INSERT INTO QUERY RecordID values('1')`, {})
    ])

        //I want to pass the result of both the queries here
    res.json({
        updateList,
        insertList,
        message:"Okay"
    })   
   } catch(err) {
      res.status(400).send(err.message)
   }
 });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...